将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
相关产品推荐
相关产品推荐

