C#.奇怪的双重行为

Bah*_*rom 2 c# double

这是让我发布这个问题的代码.

// int integer;
// int fraction;


// double arg = 110.1;

this.integer = (int)(arg);
this.fraction = (int)((arg - this.integer) * 100);
Run Code Online (Sandbox Code Playgroud)

变量integer正在变化110.没关系.

变量fraction正在增加9,但我期待10.

怎么了?


更新

我似乎发现问题的根源是减法

arg - this.integer

结果是0.099999999999994316.

现在我想知道我应该如何正确地减去以便得到结果0.1.

S.S*_*han 5

你有这个:

fraction = (int)((110.1 - 110) * 100);
Run Code Online (Sandbox Code Playgroud)

内部((110.1 - 110) * 100),将是9.999999

当你施放它时int,它会变成9

这是因为"浮点"(见此处)限制:

计算机总是需要一些表示数据的方式,最终这些表示将总是归结为二进制(0和1).整数很容易表示,但非整数有点棘手.考虑以下var:

double x = 0.1d;
Run Code Online (Sandbox Code Playgroud)

变量x实际上将最接近的可用double存储到该值.当你理解这一点时,很明显为什么有些计算似乎是"错误的".

如果你被要求添加第三个到第三个,但只能使用3个小数位,你会得到"错误的"答案:你得到的最接近的三分之一是0.333,并且将其中两个加在一起得到0.666,而不是0.667(更接近三分之二的确切值).

更新: 在财务应用程序中或数字非常重要的情况下,您可以使用decimal数据类型:

(int)((110.1m - 110) * 100)  //will be 10   (m is decimal symbol)
Run Code Online (Sandbox Code Playgroud)

要么:

 decimal arg = 110.1m;
 int integer = (int)(arg); //110
 decimal fraction = (int)((arg - integer) * 100); //will be 10
Run Code Online (Sandbox Code Playgroud)