Half-Even舍入异常:265.335保留两位小数结果不符问询
为什么265.335用Half-Even舍入保留两位小数得到265.33而非265.34?
问题核心出在浮点数的二进制存储精度限制——你代码里的265.335作为double类型存储时,并不是精确的十进制值。
本质原因
十进制的265.335无法用二进制浮点数精确表示,实际存储的double值是一个略小于265.335的近似值(比如约等于265.33499999999996)。当执行保留两位小数的Half-Even舍入时,这个近似值的第三位小数实际是4(而非你预期的5),所以会被舍去,最终得到265.33。
你可以通过打印精确值验证:
- Java中执行
System.out.println(new BigDecimal(localValue)); - C#中执行
Console.WriteLine(new decimal(a));
都会看到实际存储的数值并非精确的265.335。
解决方案
如果需要精确处理十进制小数的舍入逻辑,应该使用专门为十进制数设计的类型:
Java修正代码(使用BigDecimal)
public static void main(String []args){ BigDecimal localValue = new BigDecimal("265.335"); BigDecimal rounded = localValue.setScale(2, RoundingMode.HALF_EVEN); System.out.println(rounded); }
C#修正代码(使用decimal)
public static void Main() { decimal a = 265.335m; var rounded = Math.Round(a, 2, MidpointRounding.ToEven); Console.WriteLine(rounded); }
这两段代码都会输出预期的265.34,因为BigDecimal(Java)和decimal(C#)不存在二进制浮点数的精度损失问题。
内容的提问来源于stack exchange,提问作者Andorrax
相关产品推荐
相关产品推荐

