为何Java中HALF_EVEN模式下6.325保留两位小数得6.33?
问题解惑:HALF_EVEN舍入6.325得到6.33的原因
核心原因:浮点数的精度限制
double类型无法精确表示十进制的6.325,因为二进制浮点数在转换某些十进制小数时会产生无限循环的二进制小数,最终存储的是一个略大于6.325的近似值。你可以通过以下代码查看真实存储值:
System.out.println(new BigDecimal(6.325));
输出会是类似:6.32500000000000028421709430404007434844970703125
由于这个实际值比6.325大,它距离6.33(两位小数的上限)比距离6.32更近,并不满足“与两个相邻数值距离相等”的前提,因此HALF_EVEN规则会将其舍入到6.33,而非预期的6.32。
正确实现预期结果的方法
如果需要精确处理十进制小数的舍入,应该使用BigDecimal类,通过字符串构造函数精确表示6.325,再配合HALF_EVEN规则操作:
import java.math.BigDecimal; import java.math.RoundingMode; public class Main { public static void main(String[] args) { BigDecimal num = new BigDecimal("6.325"); BigDecimal rounded = num.setScale(2, RoundingMode.HALF_EVEN); System.out.println(rounded); // 输出6.32 } }
内容的提问来源于stack exchange,提问作者Avash Adhikari
相关产品推荐
相关产品推荐

