Python中的精度损失问题
- 引言
- 示例问题
- 问题解决
引言
在写python程序时,我们不可避免地要和小数打交道,但是python的小数有一个精度损失的问题,那么怎样来解决呢?
示例问题
加入你想开发一个程序将一定数量的钱分类成几个更小的货币单元。这个程序让用户输入总金额,这是一个用元角分来表示的浮点值,然后输出一个报告,罗列出等价的货币:XX元X角X分的,如示例运行所示:
# 我们先以11.56为案例来测试输出结果
money = input("input money")
print(money)
print(int(eval(money)),"元")
print(int (eval(money) * 10) % 10,"角")
print(int (eval(money) * 100) % 10,"分")
运算的结果是这样的
但是如果我们输入10.03以后的结果可能会变成这样
可以看到小数点后两位的03变成了02,这个例子中涉及的一个严重问题是我们在将一个浮点数转换成整型的时候可能会产生精度损失,这就可能会导致一个不准确的结果。因为你输入10.03 * 100以后变成了1002.999 999 999 99 。这样的话程序最后的结果变成了10元2分。
我来将这样的结果打印出来给大家参考一下:
money = input("input money")
print((eval(money) * 100)) #这个地方我们打印出eval(money) * 100的结果
print(int(eval(money)),"元")
print(int (eval(money) * 10) % 10,"角")
print(int (eval(money) * 100) % 10,"分")
运行结果大家可以看到
问题解决
那么如何来解决这样一个问题呢,我们可以通过使用round函数来处理数据。round函数的作用主要是用于进位,或者通俗一些来讲,就是我们常说的四舍五入,在这个地方使用round我们可以把10.03*100后变成的1002.9999通过进位的方式变成1003,我们再以刚刚的例子来运行。
money = input("input money")
print(int(round(eval(money) * 100)))
print(int(eval(money)),"元")
print(int (eval(money) * 10) % 10,"角")
print(int (round( eval(money) * 100)) % 10,"分") #注意这一句中添加了round函数
运行结果如下图所示:
这样我们就可以结果python运行中的精度损失问题了。