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

将double强制转换为int为何会改变Java计算结果?

Java类型转换导致计算结果不符的原因与解决方法

问题根源

你的代码里的核心问题是强制转换的执行时机错误:

int total = (int) price * quantity;

Java中强制转换的优先级高于乘法运算,这段代码会先把price(19.99)强制转为int类型——这个操作会直接丢弃小数部分,将19.99截断为19,再用19乘以3,最终得到57,和你的预期结果不符。

正确保留小数的解决方法

方法1:使用浮点类型存储计算结果

把total的类型改为double,去掉不必要的强制转换,让乘法在浮点精度下完成:

public class Main {
    public static void main(String[] args) {
        double price = 19.99;
        int quantity = 3;
        double total = price * quantity;
        System.out.println(total);
    }
}

运行这段代码会输出59.97,符合你的预期。

方法2:用BigDecimal处理高精度小数

如果是涉及金额这类对精度要求极高的场景,建议使用BigDecimal,避免double类型的浮点精度误差(比如19.99在double中其实是一个近似值):

import java.math.BigDecimal;

public class Main {
    public static void main(String[] args) {
        BigDecimal price = new BigDecimal("19.99");
        int quantity = 3;
        BigDecimal total = price.multiply(new BigDecimal(quantity));
        System.out.println(total);
    }
}

这种方式能保证计算结果完全精确,不会出现浮点运算带来的隐性误差。

补充:正确控制强制转换时机

如果后续需要将结果转为整数(比如只保留整数部分),要确保先完成乘法运算再进行强制转换,需要给乘法部分加括号:

int total = (int) (price * quantity);

这样会先计算19.99*3=59.97,再截断小数部分得到59,但这仅适用于不需要保留小数的场景。


内容的提问来源于stack exchange,提问作者LEANNY YAILE ALVEÑO GOMEZ

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.02 07:33:10