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

Java中如何避免double类型自动舍入?代码异常求解

解决Java中double类型自动舍入问题

首先,咱们得先搞明白为什么会出现你遇到的这个情况:double 是基于二进制的浮点数类型,它没办法精确表示所有的十进制小数(比如你用的19153570.76),当你直接输出或者进行运算时,就容易出现看似“自动舍入”的现象。

针对你给出的具体代码场景,以及更通用的避免double舍入的需求,这里有两种靠谱的解决办法:

1. 使用BigDecimal存储和处理精确小数(推荐)

这是处理金融、货币类精确数值的标准方案,能从根源上避免浮点数的精度丢失问题。

你可以这样修改代码:

import java.math.BigDecimal;

public class Main {
    public static void main(String[] args) {
        // 注意要用字符串构造BigDecimal,避免直接传double导致的精度问题
        BigDecimal balance = new BigDecimal("19153570.76");
        System.out.println(balance); // 会精确输出19153570.76
    }
}

为什么要用字符串构造?因为如果直接传double类型的19153570.76,其实这个值在double里已经是近似值了,用字符串构造才能保证完全精确。

2. 格式化输出时指定精确的小数位数(仅适用于显示场景)

如果你只是需要在输出时显示正确的数值,而不需要进行精确运算,可以用DecimalFormat来指定输出格式:

import java.text.DecimalFormat;

public class Main {
    public static void main(String[] args) {
        double balance = 19153570.76;
        DecimalFormat df = new DecimalFormat("#.00"); // 指定保留两位小数
        System.out.println(df.format(balance)); // 输出19153570.76
    }
}

不过要注意,这种方式只是改变了显示的格式,double变量本身存储的还是近似值,如果后续要对这个数值进行运算,还是会有精度问题,所以更推荐第一种用BigDecimal的方案。

总结一下,要彻底避免double的自动舍入/精度丢失,优先用BigDecimal来存储和处理精确的十进制数值;如果只是临时显示需求,可以用格式化输出控制小数位数。

内容的提问来源于stack exchange,提问作者sarath

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.21 06:28:47