C#。双

时间:2018-03-11 07:00:29

标签: c# 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

2 个答案:

答案 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