为啥python使用eval函数输出结果有很多尾数

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了为啥python使用eval函数输出结果有很多尾数相关的知识,希望对你有一定的参考价值。

参考技术A 我们都知道在计算机中数据由二进制表示,而浮点数则是小数的一种二进制表示方法。

由于浮点数存在精度限制,在Python中使用浮点数做运算时就可能会产生不确定尾数。

不确定尾数

比如0.1 + 0.2的运算结果应该是0.3,但是在Python中输出的却是0.30000000000000004。小数点后十七位出现了不确定尾数,这与浮点数的精度是相符合的。

不确定尾数的影响

不确定尾数是一种比较常见的现象,在编写程序时要注意避免,否则容易产生不易察觉的bug。

比如下面这段简单的程序,它判断用户的计算结果是否正确:

x = 0.1

y = 0.2

z = input(str(x) + '+' + str(y) + '=')

if x + y == eval(z):

print('Correct Answer')

else:

print('Wrong Answer')

如果用户输入了正确的答案0.3,程序本来应该输出“Correct Answer”,然而由于不确定尾数的存在,程序依然输出“Wrong Answer”。

实验结果:

判断出错

如何避免受不确定尾数的影响

既然知道了不确定尾数会带来不可预料的bug,我们在编写程序时就要留意避免这种局面,一种常用的方法是使用round()函数只保留运算结果的前几位小数,这样就自然去掉了小数点后十多位的不确定尾数。

刚才那段代码可以修改为如下版本:

x = 0.1

y = 0.2

z = input(str(x) + '+' + str(y) + '=')

if round(x + y, 6) == eval(z):

print('Correct Answer')

else:

print('Wrong Answer')

这里用round(x + y, 6)来保留到小数点后六位。实验结果:

Python系列eval 函数

文章目录

1. 基本概念

  • eval() 是 python 中功能非常强大的一个函数
  • 将字符串当成有效的表达式来求值,并返回计算结果
  • 所谓表达式就是:eval 这个函数会把里面的字符串参数的引号去掉,把中间的内容当成Python的代码,eval 函数会执行这段代码并且返回执行结果
  • 也可以这样来理解:eval() 函数就是实现 list、dict、tuple、与str 之间的转化
  • 安全性是 eval 最大的缺点

2. 使用举例

1 基本的数学运算

# 1. 基本的数学运算
 
result = eval("1 + 1")
print(result)  # 2

2 字符串重复

# 2. 字符串重复
result = eval("'+' * 5")
print(result)  # +++++

3 将字符串转换成列表

# 3. 将字符串转换成列表
a = "[1, 2, 3, 4]"
result = type(eval(a))
print(result)  # <class 'list'>

4 将字符串转换成字典

result = type(eval("'name': '小夏', 'age': 30"))
print(result)  # <class 'dict'>

3. eval 函数运用—— 计算器

要求:

       ~~~~~~        1.提示用户输入一个加减乘除混合运算
       ~~~~~~        2.返回计算结果

代码:

input_number = input("请输入一个加减乘除运算公式:")
print(eval(input_number))

执行结果:

4. 不要滥用 eval()

  • 在开发时千万不要使用eval直接转换input的结果
  • 因为如果用户直接通过os这个模块来调用system方法可以执行任何的终端命令,这样细想很恐怖,家底都给暴露出来了

以上是关于为啥python使用eval函数输出结果有很多尾数的主要内容,如果未能解决你的问题,请参考以下文章

JavaScript 为啥不要使用 eval

python中eval()函数和input()函数用法解析

python自动化之eval()函数

eval('500/10')为啥要保留小数

Python eval()函数的用法

python之eval函数,map函数,zip函数