[英]C#. Strange behavior of double
这是使我发布此问题的代码。
// int integer;
// int fraction;
// double arg = 110.1;
this.integer = (int)(arg);
this.fraction = (int)((arg - this.integer) * 100);
可变integer
为110
。 没关系。
可变fraction
为9
,但是我预计为10
。
怎么了?
更新
看来我发现问题的根源是减法
arg - this.integer
其结果是0.099999999999994316
。
现在,我想知道如何正确减去以使结果为0.1
。
你有这个:
fraction = (int)((110.1 - 110) * 100);
内部((110.1 - 110) * 100)
将是9.999999
当您将其转换为int
,它将四舍五入为9
这是由于“浮点数”( 请参见此处 )的限制:
计算机始终需要某种方式来表示数据,最终这些表示将始终简化为二进制(0和1)。 整数很容易表示,但非整数则比较棘手。 考虑以下变量:
double x = 0.1d;
变量x实际上将存储与该值最接近的可用double 。 当您了解这一点时,很明显为什么某些计算似乎是“错误的”。
如果要求您将三分之一加三分之一,但只能使用3个小数位,那么您会得到“错误”的答案:最接近三分之一的数字为0.333,并将其中两个相加得出0.666,而不是0.667(接近三分之二的确切值)。
更新:在金融应用程序中或数字是如此重要以至于必须精确的情况下,可以使用decimal
数据类型:
(int)((110.1m - 110) * 100) //will be 10 (m is decimal symbol)
要么:
decimal arg = 110.1m;
int integer = (int)(arg); //110
decimal fraction = (int)((arg - integer) * 100); //will be 10
这是因为您使用的是double
,精度会四舍五入,如果您想使其为10
使用decimal
类型:
检查以下内容:
int integer;
int fraction;
decimal arg = 110.1M;
integer = (int)(arg);
decimal diff = arg - integer;
decimal multiply = diff * 100;
fraction = (int)multiply;//output will be 10 as you expect
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.