这是让我发布这个问题的代码.
// 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.
你有这个:
fraction = (int)((110.1 - 110) * 100);
Run Code Online (Sandbox Code Playgroud)
内部((110.1 - 110) * 100),将是9.999999
当你施放它时int,它会变成9
这是因为"浮点"(见此处)限制:
计算机总是需要一些表示数据的方式,最终这些表示将总是归结为二进制(0和1).整数很容易表示,但非整数有点棘手.考虑以下var:
Run Code Online (Sandbox Code Playgroud)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)
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)