努力创造价值

浮点数的精度

浮点数为什么会有精度问题?

计算机是用二进制来计算储存的,程序员写的十进制的小数,计算机内部只能用二进制小数来表达1/2, 1/4, 1/8, 1/16, 1/32, 1/64, 1/128 … 1/(2^n),所以无法绝对精准。

例如:十进制的0.2。

0.01 = 1/4 = 0.25 ,太大

0.001 =1/8 = 0.125 , 又太小

0.0011 = 1/8 + 1/16 = 0.1875 , 逼近0.2了

0.00111 = 1/8 + 1/16 + 1/32 = 0.21875 , 又大了

0.001101 = 1/8+ 1/16 + 1/64 = 0.203125 还是大

0.0011001 = 1/8 + 1/16 + 1/128 = 0.1953125 这结果不错

0.00110011 = 1/8+1/16+1/128+1/256 = 0.19921875

浮点数的解决办法

展示的时候 %.2f,这种方法可以使展示准确到你想要的位数。
计算的时候可以使用round()函数来提高精度,例如float a,精准到后两位,round(a*100.00)/100。

double f = 3.4999

round(b*100.00)/100 = 3.500000

round(b) = 3.000000

ceil(b) = 4.000000

floor(b) = 3.000000

round:如果参数是小数,则求本身的四舍五入。
ceil:如果参数是小数,则求最小的整数但不小于本身.
floor:如果参数是小数,则求最大的整数但不大于本身.