You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.05 20:50:29