【发布时间】:2014-01-28 06:23:01
【问题描述】:
为什么小数点只能以 10 为底?为什么以下会引发语法错误?
0b1011101.1101
我输入的数字是否有歧义?除了93.8125
同样的问题也适用于其他基地:
0x5d.d
我可以用一个相当简单的函数来编程解决这个问题:
def base_float(number_string, base):
n = number_string.split('.')
number = int(n[0], base)
if len(n) > 1 and len(n[1]):
frac_part = float(int(n[1], base)) / base**len(n[1])
if number < 0:
frac_part = -frac_part
number += frac_part
return number
它给了我我期望的表现:
>>> base_float('0b1011101.1101', 2)
93.8125
int 接受任意基数,但没有小数点,float 接受小数点但没有任意基数。为什么?
【问题讨论】:
-
我猜没有人想要足够的功能来实现它。对于整数,二进制、八进制和十六进制往往比十六进制更有用。不过,我不知道真正的原因是什么。
-
请注意,在极少数情况下,允许使用非十进制文字中的小数部分会破坏现有代码。目前,
0b1.bit_length()是有效代码;如果引入二进制浮点文字,0b1.将是浮点文字,0b1.bit_length()将是语法错误。 -
@user2357112 这些问题已经出现。将
1..__class__与(1).__class__和1.__class__进行比较。 -
@Hyperboreus:我知道这些情况。不过,现在更改语言以允许使用非十进制浮点文字可能会破坏以前工作的代码。没有工作代码依赖于
1.__class__。 -
这确实是一个语言设计问题,user2357112 的评论是正确的:没有人想要或需要足够的功能来实现它并说服其他 Python 开发人员认为它值得在核心语言中使用。请注意,有一种从十六进制字符串转换的方法:试试
float.fromhex('123.456')
标签: python python-2.7 floating-point numbers syntax-error