说明: BigDecimal(double) 存在精度损失风险,在精确计算或值比较的场景中,可能会导致业务逻辑出现异常。正例: 优先推荐入参为String 的构造方法,或使用BigDecimal 的 valueOf 方法。
如:BigDecimal g = new BigDecimal(0.1f); 实际存储值为:0.100000001490116119384765625
BigDecimal除法可能出现不能整除的情况,比如 1.2/1.3,BigDecimal divide(BigDecimal divisor, int scale, int roundingMode)
这时会报错java.lang.ArithmeticException: Non-terminating decimal expansion; no exact representable decimal result.
这个之前也说过,这里呢再详细说说divide 方法
说明: 浮点数采用“尾数+阶码”的编码方式,类似于科学计数法的“有效数字+指数“ 的表示方式。[code]反例: float a = 1.0f - 0.9f; float b = 0.9f - 0.8 f; if(a==b){ //预期进入此代码块,执行其他业务逻辑 //但事实上a==b 的结果为false } Float x = Float.valueOf(a); Float y = Float.valueOf(b); if(x.equals(y)){ // 预期进入此代码块,执行其他业务逻辑 //但事实上x.equals(y)的结果为false }正例: 1)指定一个误差范围,若两个浮点数的差值在此范围之内,则认为是相等的。 float a = 1.0f - 0.9f; float b = 0.9f - 0.8f; //10的-6次方 float diff = 1e-6f; if(Math.abs(a-b)
二级制无法精确表示大部分十进制小数,具体原理参考《码出高效,Java开发手册》
欢迎光临 ToB企服应用市场:ToB评测及商务社交产业平台 (https://dis.qidao123.com/) | Powered by Discuz! X3.4 |