跳转到主内容
新派编程网 - 新潮编程理念,全新技术课堂!

如何在 Java 中利用 Math.floor() 实现针对价格变量的业务向下取整(如抹零促销)

价格抹零本质是向零截断,非Math.floor()的向下取整;正数可用(int)Math.floor(price),负数需用(int)price或BigDecimal.setScale(0,RoundingMode.DOWN)确保正确截去小数。 在 java 中,
math.floor()
本身是对浮点数向下取整(返回不大于参数的最大整数),但它默认返回
double
类型,且对正数和负数行为不同(例如
math.floor(-1.8)
得 -2.0)。而价格抹零促销通常指「去掉小数部分,保留整数元」,即向零截断(truncation),不是严格数学意义上的 floor。因此直接使用
math.floor()
可能出错,需结合业务场景谨慎处理。 明确“抹零”的真实含义:通常是向零取整,不是 Math.floor() 比如价格为 99.99 元 → 抹零后是 99 元; 价格为 100.0 元 → 抹零后仍是 100 元; 但注意:若出现负价格(如退款、抵扣),
Math.floor(-99.99)
返回 -100.0,这不符合“抹掉小数”逻辑(-99.99 抹零应为 -99)。所以「价格抹零」本质是截去小数位,等价于强制转为
long
或
int
(对非负价格安全): 推荐方式:
(long) price
或
Math.round(price - 0.5)
❌ 不适用;正确做法是
(int) Math.floor(price)
仅适用于 非负价格 更健壮写法:
BigDecimal.valueOf(price).setScale(0, RoundingMode.DOWN).intValue()
(支持任意精度与符号) 针对常见价格变量类型的操作建议 假设价格变量是
double price = 199.99;
: 若确保价格 ≥ 0,最简写法:
int roundedDown = (int) Math.floor(price);
→ 结果 199 若可能含负值(如优惠券冲抵后为负),改用:
int truncated = (int) price;
(自动向零截断)→ -199.99 变 -199 若价格来自数据库或用户输入,建议先转为
BigDecimal
避免浮点误差:
BigDecimal bd = BigDecimal.valueOf(price);
int yuan = bd.setScale(0, RoundingMode.DOWN).intValue();
避免浮点数精度陷阱的实战提醒 直接写
double price = 9.99;
在二进制中无法精确表示,实际可能是 9.989999999999999…,此时
Math.floor(price)
仍得 9.0 —— 看似正确,但隐患在计算链中放大。例如: 错误示范:
double p = 100 * 0.99; // 实际≈98.99999999999999 → floor=98
正确做法:价格运算全程用
BigDecimal
,或以「分」为单位用
long
存储:
long priceInCents = 9999L; // 表示 99.99 元
long yuan = priceInCents / 100; // 直接整除,天然抹零
封装一个安全的抹零工具方法 可复用的静态方法示例(兼顾可读性与健壮性): Eclipse导入Android或其他的JAVA项目的正确方法 WORD版 本文档主要讲述的是Eclipse导入Android或其他的JAVA项目的正确方法;希望本文档会给有需要的朋友带来帮助;感兴趣的朋友可以过来看看 下载
public static int truncateToYuan(double price) { if (Double.isNaN(price) || Double.isInfinite(price)) { throw new IllegalArgumentException("Invalid price: " + price); } return BigDecimal.valueOf(price) .setScale(0, RoundingMode.DOWN) .intValue(); }
调用:
truncateToYuan(299.999)
→ 299,
truncateToYuan(-299.999)
→ -299,符合价格业务直觉。 立即学习 “ Java免费学习笔记(深入) ”;

相关文章