如何格式化一个浮点数,使其不包含尾随零?换句话说,我希望得到的字符串尽可能短。
例如:
3 -> "3"
3. -> "3"
3.0 -> "3"
3.1 -> "3.1"
3.14 -> "3.14"
3.140 -> "3.14"
发布于 2010-03-14 09:11:25
我,我会做的
--保证定点格式,而不是科学记数法,等等。
,但是,它是有效的(我不知道如何强制
从不使用科学记数法;-)。
发布于 2010-03-14 08:34:31
你可以使用
要实现这一点,请执行以下操作:
'%g'%(3.140)
或者,使用Python≥2.6:
'{0:g}'.format(3.140)
或者,使用Python≥3.6:
f'{3.140:g}'
从
文档
:
原因(在其他方面)
无关紧要的尾随零
要成为
从有效位数中删除,如果小数点后面没有剩余的数字,小数点也将被删除。
发布于 2016-06-10 05:17:10
在看了几个类似问题的答案后,这似乎是我最好的解决方案:
def floatToString(inputValue):
return ('%.15f' % inputValue).rstrip('0').rstrip('.')
我的理由是:
并没有摆脱科学记数法。
>>> '%g' % 0.000035
'3.5e-05'
15位小数似乎避免了奇怪的行为,并且有足够的精度来满足我的需求。
>>> ('%.15f' % 1.35).rstrip('0').rstrip('.')
'1.35'
>>> ('%.16f' % 1.35).rstrip('0').rstrip('.')
'1.3500000000000001'
我本可以用
而不是
,但这有点慢(~30%)。
我本可以用
,但这也有一些问题。首先,它的速度要慢得多(~11倍)。我还发现,虽然它有相当高的精度,但在使用时仍然会受到精度损失的影响。
..。
>>> Decimal('0.21000000000000000000000000006').normalize()
Decimal('0.2100000000000000000000000001')
>>> Decimal('0.21000000000000000000000000006')
Decimal('0.21000000000000000000000000006')
最重要的是,我仍然会转换为
从一个
这可能会让你得到一些与你输入的数字不同的东西。我想
当算术保持不变时,效果最好
和
是用字符串初始化的。
>>> Decimal(1.35)
Decimal('1.350000000000000088817841970012523233890533447265625')
>>> Decimal('1.35')
Decimal('1.35')
我相信精确度的问题
可以使用上下文设置来调整到需要的内容,但是考虑到已经很慢的速度和不需要荒谬的精度,以及我仍然需要从浮点型转换并失去精度的事实,我认为它不值得追求。
我不关心可能的"-0“结果,因为-0.0是一个有效的浮点数,而且它可能很少出现,但是既然你确实提到你想让字符串结果尽可能短,你总是可以使用一个额外的条件,而额外的速度代价非常小。
def floatToString(inputValue):
result = ('%.15f' % inputValue).rstrip('0').rstrip('.')
return '0' if result == '-0' else result
https://stackoverflow.com/questions/2440692
复制相似问题