Android Kotlin 中如何实现按规则截断保留一位小数的数学函数
实现保留1位小数截断效果的解决方案
核心需求说明
- 输入25.69,输出25.6
- 输入-0.40,输出-0.4
- 输入-0.004,输出0或0.0
需求本质是直接截断小数点第二位及之后的内容,不做四舍五入。你之前测试的
Math.ceil/Math.round/Math.floor都是整数取整方法,本身不支持保留小数位的操作,因此无法得到预期结果。
可用实现方案
方案1:算术截断法(最简实现)
核心逻辑是先将数值放大10倍,强制转换为int截断小数部分后再缩小10倍,适配所有需求场景:
public static double truncateToOneDecimal(double value) { // 放大10倍后截断小数部分,再缩小10倍恢复量级 return (int)(value * 10) / 10.0; }
测试结果:
- 输入
25.69→ (int)(256.9)=256 → 256/10.0=25.6 - 输入
-0.40→ (int)(-4.0)=-4 → -4/10.0=-0.4 - 输入
-0.004→ (int)(-0.04)=0 → 0/10.0=0.0
方案2:DecimalFormat格式化(适合输出字符串场景)
如果需要直接得到格式化后的字符串,可以通过设置截断模式实现:
import java.text.DecimalFormat; import java.math.RoundingMode; public static String formatToOneDecimal(double value) { DecimalFormat decimalFormat = new DecimalFormat("#.#"); // 设置为DOWN模式,直接截断多余小数,不做四舍五入 decimalFormat.setRoundingMode(RoundingMode.DOWN); return decimalFormat.format(value); }
方案3:BigDecimal实现(高精度场景适用)
如果对浮点数精度要求极高,避免算术运算的精度误差,推荐使用BigDecimal实现:
import java.math.BigDecimal; import java.math.RoundingMode; public static double truncateToOneDecimal(double value) { return BigDecimal.valueOf(value) // 保留1位小数,采用截断模式 .setScale(1, RoundingMode.DOWN) .doubleValue(); }
内容的提问来源于stack exchange,提问作者Jaimin Modi
相关产品推荐
相关产品推荐

