在JAVA中如何将double变量截断保留两位小数后赋值给其他变量
Java实现double保留两位小数且不四舍五入的方案
下面给出3种常见实现方式,按需选择即可:
1. 数学计算法(简单场景可用)
通过先乘100取整再除以100实现截断,注意适配正负值:
double original = 3.4586748547; // 正数用floor向下取整,负数用ceil向上取整才能保证是截断而不是进一位 double result = original < 0 ? Math.ceil(original * 100) / 100 : Math.floor(original * 100) / 100; System.out.println(result); // 输出3.45
注意:该方法依赖double的运算,部分特殊数值会出现精度丢失问题,比如0.07乘100可能得到6.999999999999999,对精度要求高的场景不推荐使用。
2. BigDecimal实现(生产环境推荐)
用Java自带的高精度运算类BigDecimal,指定截断规则即可,稳定性最高:
import java.math.BigDecimal; import java.math.RoundingMode; double original = 3.4586748547; BigDecimal decimal = BigDecimal.valueOf(original); // setScale第一个参数是保留小数位数,第二个参数RoundingMode.DOWN表示直接截断不四舍五入 decimal = decimal.setScale(2, RoundingMode.DOWN); double result = decimal.doubleValue(); System.out.println(result); // 输出3.45
优势:完全规避了double的精度问题,RoundingMode.DOWN规则明确就是直接丢弃多余小数,不会出现边界错误。
3. 字符串截取法(不推荐,仅作参考)
把数值转成字符串后截取小数点后两位再转回double,代码如下:
double original = 3.4586748547; String numStr = String.valueOf(original); int dotPos = numStr.indexOf("."); if (dotPos != -1 && numStr.length() > dotPos + 2) { numStr = numStr.substring(0, dotPos + 3); } double result = Double.parseDouble(numStr); System.out.println(result); // 输出3.45
缺陷:如果数值过大/过小会用科学计数法表示,此时截取会直接报错,仅适合数值范围固定、不会出现科学计数法的场景。
内容的提问来源于stack exchange,提问作者EnanSaysHi
相关产品推荐
相关产品推荐

