繁体   English   中英

C#。 双重行为

[英]C#. Strange behavior of double

这是使我发布此问题的代码。

// int integer;
// int fraction;


// double arg = 110.1;

this.integer = (int)(arg);
this.fraction = (int)((arg - this.integer) * 100);

可变integer110 没关系。

可变fraction9 ,但是我预计为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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM