我不明白为什么会这样,值l/m
不会被截断为点后两位小数......
root@OpenWrt:~# python3
Python 3.7.4 (default, Sep 15 2019, 18:13:03)
[GCC 7.4.0] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> l = round((69.2222222/100),2)
>>> print(l)
0.68999999999999995
>>> type(l)
<class 'float'>
>>> m = 69.22222222/100
>>> print(m)
0.69222222220000007
>>> type(m)
<class 'float'>
>>> round(m,2)
0.68999999999999995
这发生在自定义 openWRT 18.6 构建中,并且(几乎(安装了完整的 python3。
为什么会这样?
我是否缺少任何包裹?
摘要:您得到的答案是正确的,但是它没有按预期打印。 幸运的是,无需修复构建即可轻松修复。
1(答案是正确的。 对于会话中的0.69
和舍入答案,基础 C 双精度相同:
>>> (0.68999999999999995).hex()
'0x1.6147ae147ae14p-1'
>>> (0.69).hex()
'0x1.6147ae147ae14p-1'
2(构建中的打印例程省略了Python为显示尽可能短的等效表示所做的努力。这是我系统上的相同会话:
Python 3.8.1 (v3.8.1:1b293b6006, Dec 18 2019, 14:08:53)
[Clang 6.0 (clang-600.0.57)] on darwin
Type "help", "copyright", "credits" or "license()" for more information.
>>> l = round((69.2222222/100),2)
>>> print(l)
0.69
>>> m = 69.22222222/100
>>> print(m)
0.6922222222000001
>>> round(m, 2)
0.69
3(出于显示目的,只需使用字符串格式的舍入。即使您的构建省略了最短的输出例程,这也将起作用:
>>> m = 69.22222222/100
>>> format(m, '.2f')
'0.69'