在Python中是否可以有一个不带小数点的浮点数?

时间:2018-07-17 03:54:53

标签: python numbers

我之所以这样问是因为R中有可能。请注意,1.5和1均为数字类型(双精度),只有1L是整数。将字符串强制转换为数字类型时,如果字符串中没有一个小数点,则不会显示小数点。

class(1.5)
# "numeric"
class(1)
# "numeric"
class(1L)
# "integer"
x <- as.numeric("3")
x
# 3
class(x)
# "numeric"

我可以在Python中进行类似的操作吗?假设我有一个名为key_in_a_number的函数:

def key_in_a_number():
    num = input("Key in a number here: ")
    try:
        return float(num)
    except ValueError:
        return "Please key in only numbers."

现在,如果一个键输入“ 40”,它将返回40.0,但是 40.0和40在某些数字上是不同的。因此,如果键入“ 40”,则应返回40;而只有键入“ 40.0”时,应返回40.0。

我的解决方法是:

def key_in_a_number():
    num = input("Key in a number here: ")
    try:
        return int(num)
    except ValueError:
        try:
            return float(num)
        except ValueError:
            return "Please key in only numbers."

但是,以这种方式,我不能确定结果是否始终是同一类型,这在后续数据存储或处理中可能会出现问题。有什么方法可以让浮点数中的数字不带小数点?

2 个答案:

答案 0 :(得分:3)

我认为您的核心问题是您误解了float是什么。

A float代表C的两倍,几乎总是意味着IEEE 754-1985 double(或IEEE 754-2008 binary64,这基本上是相同的东西,但稍好一点定义)。它始终具有53个二进制数位的精度。您将其指定为40.40.00000float(40)float('40')还是float('40.00')都没有关系;这些在各个方面都是相同的。

因此,您要询问的主要问题没有任何意义:

  

现在,如果一键输入“ 40”,它将返回40.0,但是40.0和40在某些数字上是不同的。

不,不是。 float("40")float("40.0")都是完全相同的值,数字没有差异,精度也没有差异。


Python decimal库中有一个 different 类型,它表示IEEE 754-2008任意大小的decimal。它具有与您要求的一样多的精度十进制数字。

因此,Decimal('40')Decimal('40.')有两位数字; Decimal('40.000')有五个数字-它们可能等于 ,但它们与相同并不相同,因为最后一位更精确。


另一方面,

Decimal打印出实际上具有的许多精度:

>>> print(Decimal('40'))
40
>>> print(Decimal('40.'))
40
>>> print(Decimal('40.0'))
40.0

在此过程中,如果您想要floatint值,请按照以下步骤将R的每一行转换为Python:

class(1.5) # numeric
type(1.5) # float
class(1) # numeric
type(1) # int
type(1.) # float
class(1L) # integer
type(1) # int
x <- as.numeric("3") # numeric
x = float(3) # float
x = float("3") # float

请注意,就像as.numeric("3")给您numeric而不是integer一样,float(“ 3”)gives you a float rather than an int`。考虑到它与等效的R行为相同,我不确定为什么Python的行为会让您感到困惑。

答案 1 :(得分:0)

是的

10在Python中将是一个整数,而代表相同数字的10.将是一个浮点数。