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