将浮点数转换为一定精度,然后复制到字符串
- 2025-03-18 08:54:00
- admin 原创
- 47
问题描述:
我有一个浮点数,比如说135.12345678910
。我想将该值连接到字符串,但只想要135.123456789
。使用 print,我可以通过执行以下操作轻松完成此操作:
print "%.9f" % numvar
这numvar
是我原来的号码。有什么简单的方法可以做到这一点吗?
解决方案 1:
对于 Python <3 (例如 2.6 [参见注释] 或 2.7),有两种方法可以实现。
# Option one
older_method_string = "%.9f" % numvar
# Option two
newer_method_string = "{:.9f}".format(numvar)
但请注意,对于 Python 3 以上的版本(例如 3.2 或 3.3),最好使用选项二。
有关第二种选择的更多信息,我建议参阅Python 文档中有关字符串格式的链接。
有关选项 1 的更多信息,请参阅此链接,其中有关于各种标志的信息。
Python 3.6(2016年12月正式发布)添加了f
字符串字面量,更多信息请见这里,它扩展了该str.format
方法(使用花括号来f"{numvar:.9f}"
解决原始问题),即
# Option 3 (versions 3.6 and higher)
newest_method_string = f"{numvar:.9f}"
解决了问题。查看@Or-Duan 的回答了解更多信息,但这种方法很快。
解决方案 2:
Python 3.6
为了清楚起见,您可以使用f 字符串格式。它的语法与方法几乎相同format
,但更美观一些。
例子:
print(f'{numvar:.9f}')
有关新 f 字符串的更多阅读:
Python 3.6 中的新增功能(与上面相同的链接)
PEP 官方文档
Python 官方文档
非常好的博客文章 - 也谈到了性能
以下是各种测试方法的执行时间图表(来自上面的最后一个链接):
解决方案 3:
使用round
:
>>> numvar = 135.12345678910
>>> str(round(numvar, 9))
'135.123456789'
解决方案 4:
如果直到运行时才知道精度,则此其他格式化选项很有用:
>>> n = 9
>>> '%.*f' % (n, numvar)
'135.123456789'
解决方案 5:
格式化不是由打印完成的,它是字符串的一个属性,因此您只需使用
newstring = "%.9f" % numvar
解决方案 6:
要设置 9 位数字的精度,请获取:
print "%.9f" % numvar
返回 2 位数字的精度:
print "%.2f" % numvar
返回精度为 2 位的数字和浮点转换值:
numvar = 4.2345
print float("%.2f" % numvar)
解决方案 7:
只要小数点数在范围内,它就可以工作;超出范围则取决于硬件。超过小数点后 14 位,我无法让它匹配。来自数字海拔文件的纬度值
https://docs.python.org/3/tutorial/floatingpoint.html
lat1 = -81.0016666666670072
lat2 = -81.0016666666670062
assert lat1 == lat2 # no asserion error :(
# try with Decimal
from decimal import *
getcontext().prec = 16
assert Decimal(lat1) == Decimal(lat2) # no asserion error :(
# Lets see string representation
print(f"{lat1:.16f}", f"{lat2:.16f}")
# -81.0016666666670062 -81.0016666666670062 :( Perils of Float
# Lets see how it is store in hardware
print(lat1.hex(), lat2.hex())
# -0x1.4401b4e81b500p+6 -0x1.4401b4e81b500p+6
# 14-th position it is able to identify
lat1 = -81.0016666666670162
lat2 = -81.0016666666670062
#-0x1.4401b4e81b501p+6 -0x1.4401b4e81b500p+6
print(lat1.hex(), lat2.hex())
assert lat1 == lat2 # assertion error :)
解决方案 8:
该str
函数有错误。请尝试以下操作。您将看到 '0,196553',但正确的输出是 '0,196554'。因为该str
函数的默认值是 ROUND_HALF_UP。
>>> value=0.196553500000
>>> str("%f" % value).replace(".", ",")
扫码咨询,免费领取项目管理大礼包!