将float转换为字符串而不对其进行舍入

Gal*_*leo 83 python string floating-point rounding

我正在创建一个程序,由于不需要解释的原因,需要将float转换为字符串以使用len()进行计数.但是,str(float(x))导致x在转换为字符串时被舍入,这会抛出整个事物.有谁知道它的修复?如果你想知道,这是使用的代码:

len(str(float(x)/3))
Run Code Online (Sandbox Code Playgroud)

Joh*_*uhy 122

在处理浮点数时,某种形式的舍入通常是不可避免的.这是因为您可以在基数10中准确表达的数字并不总是精确地表示在基数2(您的计算机使用的数字)中.

例如:

>>> .1
0.10000000000000001
Run Code Online (Sandbox Code Playgroud)

在这种情况下,您将看到.1转换为字符串使用repr:

>>> repr(.1)
'0.10000000000000001'
Run Code Online (Sandbox Code Playgroud)

我相信当你使用str()来解决这个问题时,python会删掉最后几位数,但这是一个部分解决方法,不能代替理解正在发生的事情.

>>> str(.1)
'0.1'
Run Code Online (Sandbox Code Playgroud)

我不确定"舍入"究竟是什么问题导致你.也许你会更好地使用字符串格式化来更精确地控制输出?

例如

>>> '%.5f' % .1
'0.10000'
>>> '%.5f' % .12345678
'0.12346'
Run Code Online (Sandbox Code Playgroud)

文档在这里.


nos*_*klo 11

len(repr(float(x)/3))
Run Code Online (Sandbox Code Playgroud)

但是我必须说这不像你想象的那么可靠.

浮点数以十进制数输入/显示,但您的计算机(实际上是标准C库)将它们存储为二进制数.这种转变会产生一些副作用:

>>> print len(repr(0.1))
19
>>> print repr(0.1)
0.10000000000000001
Run Code Online (Sandbox Code Playgroud)

关于为什么会发生这种情况的解释在python教程的这一章中.

解决方案是使用专门跟踪十进制数字的类型,如python decimal.Decimal:

>>> print len(str(decimal.Decimal('0.1')))
3
Run Code Online (Sandbox Code Playgroud)