十进制负数和正数总和

时间:2015-02-20 10:39:32

标签: java c#

在Java和C#中:

int a = (int)(-1.5 + 2.5);
int b = (int)(-1.55 + 2.55);
int c = (int)(1.45 + 2.55);
// a = 1; b = 0; c = 4;

有没有人可以解释为什么在小数点后面加2位或更多位数的正数加上正数会导致十进制数中断? “b = 0.99999999999999978”。

所以问题是 - 为什么“-1.5 + 2.5 = 1”,但“-1.55 + 2.55 = 0”?

2 个答案:

答案 0 :(得分:3)

这是因为类型double是近似值。

通常double表示IEEE 754标准类型decimal64


  

Math.Round可让您指定 MidpointRounding

     

ToEven - 当一个数字介于另外两个数字之间时,它会向最接近的偶数舍入。

     

AwayFromZero - 当一个数字介于另外两个数字之间时,它会向最接近零的数字四舍五入。

示例:

var val = (int)Math.Round((-1.55 + 2.55), 1, MidpointRounding.ToEven);
Console.WriteLine(val);

输出:1


初学者的常见错误是编写如下代码:

for (double i = 0.0; i == 6.0; i+=0.1)
{
    Console.WriteLine(i);
}

提示:这将不会以~60步结束。

答案 1 :(得分:1)

使用double时,无法正确表示IEEE-754格式的某些小数。而是使用BigDecimal。 例如:

BigDecimal result = new BigDecimal("-1.55").add(new BigDecimal("2.55"));