Java 十进制负数和正数之和

Java 十进制负数和正数之和,java,c#,Java,C#,在Java和C语言中: 谁能解释一下为什么在小数点后加上两位或两位以上的正数和负数会导致小数中断?“b=0.999999999978”。 所以问题是-为什么“-1.5+2.5=1”,但是“-1.55+2.55=0”?在使用双精度时,IEEE-754格式中的一些小数不能正确表示。而是使用BigDecimal。 例如: BigDecimal result = new BigDecimal("-1.55").add(new BigDecimal("2.55")); 使用double时,IEEE-75

在Java和C语言中:

谁能解释一下为什么在小数点后加上两位或两位以上的正数和负数会导致小数中断?“b=0.999999999978”。
所以问题是-为什么“-1.5+2.5=1”,但是“-1.55+2.55=0”?

在使用双精度时,IEEE-754格式中的一些小数不能正确表示。而是使用BigDecimal。 例如:

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

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

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

这是因为type
double
是一种近似值

通常
double
表示标准类型


Math.Round
允许您指定中点舍入:

ToEven-当一个数字位于其他两个数字的中间时,它将向最近的偶数进位

远离零-当一个数字位于其他两个数字的中间时,它将向远离零的最近数字舍入

例如:

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步后结束

这是因为类型
double
是一种近似值

通常
double
表示标准类型


Math.Round
允许您指定中点舍入:

ToEven-当一个数字位于其他两个数字的中间时,它将向最近的偶数进位

远离零-当一个数字位于其他两个数字的中间时,它将向远离零的最近数字舍入

例如:

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步后结束

0.99999999999978的可能重复在您转换为int时不会四舍五入到最接近的整数,但会进入底部-它将变为0。这很清楚,但是-1.5也是一个双精度。为什么它只影响点后有2+位的双精度数字?@Maksim:这与小数位数无关。如果您尝试
intd=(int)(-1.54+2.54)
结果将再次成为预期结果。正如约翰·普林斯(Johan Prins)在他的回答中所说:有些小数不能精确地表示为浮点数。好的,所以在将它们用作整数之前检查double非常重要,可以使用round函数,也可以使用BigDecimals。谢谢此外,当您转换为int时,0.99999999978不会四舍五入到最接近的整数,但会进入底部-它将变为0。这很清楚,但是-1.5也是一个双精度。为什么它只影响点后有2+位的双精度数字?@Maksim:这与小数位数无关。如果您尝试
intd=(int)(-1.54+2.54)
结果将再次成为预期结果。正如约翰·普林斯(Johan Prins)在他的回答中所说:有些小数不能精确地表示为浮点数。好的,所以在将它们用作整数之前检查double非常重要,可以使用round函数,也可以使用BigDecimals。谢谢是否可以避免将双精度转换为字符串?建议在BigDecimal上使用字符串构造函数,因为双精度构造函数也可能给出错误的结果。基于此,我将选择“不”。首先,不要在这些计算中使用double。是否可以避免将double转换为字符串?建议在BigDecimal上使用字符串构造函数,因为double构造函数也可能给出错误的结果。基于此,我将选择“不”。首先,不要在这些计算中使用double。