我需要对浮点数进行舍入以在UI中显示.例如,一个重要人物:
1234 - > 1000
0.12 - > 0.1
0.012 - > 0.01
0.062 - > 0.06
6253 - > 6000
1999年 - > 2000年
有没有一种很好的方法可以使用Python库来实现这一点,还是我必须自己编写?
有没有办法看到内置函数如何在python中工作?我不是指如何使用它们,而是它们是如何构建的,排序或枚举背后的代码是什么......?
我正面临着一个奇怪的round()功能行为:
for i in range(1, 15, 2):
n = i / 2
print(n, "=>", round(n))
Run Code Online (Sandbox Code Playgroud)
此代码打印:
0.5 => 0
1.5 => 2
2.5 => 2
3.5 => 4
4.5 => 4
5.5 => 6
6.5 => 6
Run Code Online (Sandbox Code Playgroud)
我希望浮动值总是向上舍入,而是舍入到最接近的偶数.
为什么会出现这种行为,以及获得正确结果的最佳方法是什么?
我尝试使用fractions但结果是一样的.
在几乎每个系统上,Python都可以为您提供人类可读的浮点的简短表示形式,而不是17位的机器精度:
Python 3.3.0 (default, Dec 20 2014, 13:28:01)
[GCC 4.8.2] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> 0.1
0.1
>>> import sys; sys.float_repr_style
'short'
Run Code Online (Sandbox Code Playgroud)
在ARM926EJ-S上,您没有简短的表示形式:
Python 3.3.0 (default, Jun 3 2014, 12:11:19)
[GCC 4.7.3] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> 0.1
0.10000000000000001
>>> import sys; sys.float_repr_style
'legacy'
Run Code Online (Sandbox Code Playgroud)
对于大多数系统,Python 2.7显然将此简短表示形式添加到repr():
现在,在大多数平台上都可以正确舍入浮点数和字符串之间的转换。这些转换发生在许多不同的地方:str()代表浮点数和复数;浮动和复杂构造函数;数字格式;使用marshal,pickle和json模块对浮点数和复数进行序列化和反序列化;在Python代码中解析float和虚数文字;和十进制到浮点转换。
与此相关的是,浮点数x的repr()现在基于最短的十进制字符串返回一个结果,该字符串保证在正确的舍入(使用“从一半到一半到四舍五入的舍入模式”下)可以四舍五入为x。以前,它根据x舍入到17个十进制数字给出了一个字符串。
负责此改进的舍入库可在Windows和使用gcc,icc或suncc编译器的Unix平台上工作。可能在少数平台上无法保证此代码的正确操作,因此在此类系统上不使用该代码。您可以通过检查sys.float_repr_style来确定正在使用的代码,如果正在使用新代码,则将简短显示,而如果未使用,则将使用旧代码。
他们说某些平台不能保证( dtoa.c …