C#,确定*如果*一个double可以变成int而不会有任何损失
本文关键字:int 不会有 任何 损失 确定 如果 一个 double | 更新日期: 2023-09-27 18:05:16
可能重复:
如何确定小数/双精度是否为整数?
我有一种独特的情况,在这种情况下,所有数字都必须保存为数据库中的double
数据类型,但只有在特定条件下,超过整数级别的精度才有价值。
起初,我试图只使用int
,然后当这些独特的分数出现时抽象到一个新的表,但在这样做了几个星期后,我现在发现这太愚蠢了,浪费了我的时间。
我知道我可以把double
变成int
。这很容易。我知道如何把它翻译一遍。我不知道的是如何测试翻译。我基本上想想出一个简短、简单的方法来表达
这个数字真的是一个二重,还是只是一个int?
如果它是一个int(大多数时候,它都是(,那么我会把它变成一个,并把它当作一个int来处理。但由于需求的唯一性,我仍然必须将数据库中的所有内容都保存为double
。
有什么想法吗?我知道这是一个新手问题,我已经在谷歌上搜索了几个小时,仍然很困惑。
将其转换为int
并查看其是否仍然相等:
if ((int)val == val)
CCD_ 7将截断任何分数部分。
请注意,如果数字太大而无法在double
中保持完全精度,则可能会出现意外情况。
double d = ...;
if(d == (int)d)
//is int
else
//is not int
当然,由于一些精度问题,这可能无法100%工作。你可以使用
double d = ...;
if(Math.Abs(d - (int)d) < Epsilon) //const double Epsilon = 0.000001;
//is int
else
//is not int
这篇类似的文章向您展示了如何确定双精度或小数是否有小数位数。您可以使用它来确定它的类型,然后进行适当的存储。
接受来自该帖子的答案:
对于浮点数字,n % 1 == 0
通常是检查是否有超过小数点的内容的方法。
public static void Main (string[] args)
{
decimal d = 3.1M;
Console.WriteLine((d % 1) == 0);
d = 3.0M;
Console.WriteLine((d % 1) == 0);
}
输出:
False
True
尝试这个
double x = ......
if (Math.truncate(x) == x)
....... (is integer, unless its so big its outside the bounds)