以下是让我发布此问题的代码。
// 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
。
答案 0 :(得分:5)
你有这个:
fraction = (int)((110.1 - 110) * 100);
内部((110.1 - 110) * 100)
,将是9.999999
当你把它投射到int
时,它会变成9
这是因为"浮点" (see here)限制:
计算机总是需要某种方式来表示数据,并最终 这些表示将始终归结为二进制(0和1)。 整数很容易表示,但非整数更多 棘手。考虑以下var:
double x = 0.1d;
变量x实际上会存储最接近的可用双 那个价值。当你理解这一点时,很明显为什么有些人 计算似乎是"错误"。
如果要求您添加第三个到第三个,但只能使用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
答案 1 :(得分:1)
这是因为您正在使用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