我有奇怪的十进制计算,真的让我吃惊,我有两个大十进制数字,一个是正常过程,另一个是报价。然后我想计算折扣百分比并将其限制为最接近的整数。
这是代码:
BigDecimal listPrice = new BigDecimal(510000);
BigDecimal offerPrice = new BigDecimal(433500);
int itemDiscount = (int)Math.ceil(((listPrice.longValue() - offerPrice.longValue()) / (float) listPrice.longValue()) * 100);
我希望它会设置 15 作为 itemDiscount 的值,但令人惊讶的是它有 16,哇。然后我打印每个计算以显示哪个语句是问题,所以我为每个语句输入 System.out.println 如下:
System.out.println(listPrice.longValue() - offerPrice.longValue()); //==> show 76500
System.out.println((listPrice.longValue() - offerPrice.longValue()) / (float) listPrice.longValue()); // ==> 0.15
System.out.println((listPrice.longValue() - offerPrice.longValue()) * 100 / (float) listPrice.longValue()); // ==> 15.000001
问题出在上面的语句中,它没有返回 15.0,而是返回 15.000001。当我设置上限时,它当然会返回 16 而不是 15。
如果是这种情况怎么解释?这是它的方式还是它是一个错误?