最近写一个功能,需要计算商品的价格,由“数量*单价*折扣”,然后需要保留小数点后两位,并且要求向上取值,网上百度了部分答案
当折扣为0.9634时
Math.floor(1 * 20 *
0.9634 * 100) / 100 //19.26
// 输出结果为 19.26,而实际上不取整的值为19.268,保留小数点后两位向上取值应为19.27
于是改用向上取值
Math.ceil(1 * 20 * 0.9634 * 100) / 100
// 输出结果为 19.27
Math.ceil(1 * 20 * 0.96 * 100) / 100
//输出结果为19.21,而实际上我需要的值为19.2
考虑为什么会出现19.21的原因?
内存中存储float数据时,当为整数时,会在小数点后最后一位产生一位随机数,例如float(3),存储空间为3.000000000001,因此向上取整时会导致19.2向上进位为19.21.
于是思考整数乘以小数点后两位数的值,还是一个小数点后两位数的值,于是修改公式
Math.ceil(Math.floor(1 * 20 * 0.9634 * 10000)/100)/100//19.27
Math.ceil(Math.floor(1 * 20 * 0.96 * 10000)/100)/100//19.2
使用参数_num(数量)、_price(单价)、_rate(比例)
Math.ceil(Math.floor(_num * _price * _rate * 10000)/100)/100