BigDecimal乘法后无法保留8位精度,结果不符预期求助
问题根源:Double类型的精度损失
你遇到的问题核心在于double类型本身的精度局限性。当你用BigDecimal.valueOf(BuyPrice)把double值转成BigDecimal时,这个double值已经不是你写的0.00001297了——因为浮点数(double/float)无法精确表示所有十进制小数,它存储的是一个近似值。
比如,0.00001297作为double实际存储的数值可能是0.000012970000000000000...(比字面量略大),乘以2120之后,结果会略大于0.02749639,这时候用HALF_DOWN舍入到8位小数,就会得到0.02749640。
解决方案:用字符串初始化BigDecimal
要避免这个问题,你需要直接用字符串来创建BigDecimal,这样就能保留精确的十进制数值,不会有浮点数的精度损失。
修正后的代码如下:
import java.math.BigDecimal; import java.math.RoundingMode; public class Main { public static void main(String[] args) { BigDecimal amount = new BigDecimal("2120"); BigDecimal buyPrice = new BigDecimal("0.00001297"); BigDecimal result = buyPrice.multiply(amount).setScale(8, RoundingMode.HALF_DOWN); System.out.println(result); // 输出:0.02749639 } }
额外说明
BigDecimal.valueOf(double)适合用于那些能被double精确表示的数值(比如整数、有限小数),但对于像0.00001297这种无法精确表示的小数,一定要用字符串构造方法。- 如果你必须从double转换,也可以先把double转成精确的字符串(比如用
Double.toString(double)),再传入BigDecimal的构造方法,但直接用字符串字面量是最可靠的方式。
内容的提问来源于stack exchange,提问作者Mixalis Navridis
相关产品推荐
相关产品推荐

