如何获得小数点后的数字?

l--*_*''' 101 python floating-point decimal

如何获得小数点后的数字?

例如,如果我有5.55,我怎么得到.55

jer*_*jer 164

5.55 % 1
Run Code Online (Sandbox Code Playgroud)

请记住,这不会帮助您解决浮点舍入问题.即,你可能得到:

0.550000000001
Run Code Online (Sandbox Code Playgroud)

或者稍微偏离你期望的0.55.

  • 至于`modf`,它也可以拧紧精度:`math.modf(5.55)`将返回(0.5499999999999998,5.0). (7认同)
  • 这不适用于负数 (5认同)
  • 在Raspberry Pi上,这个方法`x%1`几乎是`x-int(x)`和`modf(x)[0]`方法的两倍(时间平均为980ns,1.39us和1.47us)超过1000000次运行).我对"x"的价值总是积极的,所以我不必担心. (3认同)
  • 请注意,这会破坏负数。 (3认同)
  • 这不适用于负数 (3认同)
  • 有谁知道哪个是更快的操作,上面描述的这种方法,或者: float b = a - int(a) ?我怀疑是后者,但想看看是否有确认 (2认同)
  • @hokkuk测量它? (2认同)
  • @wjandrea 哎呀!删除了我的评论,以免误导人们——我使用 `math.modf()` 解决方案,现在它在所有情况下都正确。 (2认同)

Ant*_*y V 141

使用modf:

>>> import math
>>> frac, whole = math.modf(2.5)
>>> frac
0.5
>>> whole
2.0
Run Code Online (Sandbox Code Playgroud)

  • 这应该是公认的答案@l - '''''' - ' - '''''''''''' (14认同)
  • @LordLoh。那是因为浮点舍入,任何方法都会发生。 (9认同)
  • 好的解决方案,但是`math.modf(2.53)=(0.5299999999999998,2.0)`的预期答案是0.53 (2认同)
  • @LordLoh。尝试使用 round(0.5299999999999998 , 2) 来获得 0.53 另一种方法是使用decimal包中的Decimal。https://docs.python.org/2/library/decimal.html (2认同)
  • @Rena 更准确地说:“...对于任何结果必须以 IEEE 754 双精度浮点形式给出的方法都会发生。” (2认同)

Jim*_*som 50

关于什么:

a = 1.3927278749291
b = a - int(a)

b
>> 0.39272787492910011
Run Code Online (Sandbox Code Playgroud)

或者,使用numpy:

import numpy
a = 1.3927278749291
b = a - numpy.fix(a)
Run Code Online (Sandbox Code Playgroud)


int*_*ted 31

使用decimal标准库中的模块,您可以保留原始精度并避免浮点舍入问题:

>>> from decimal import Decimal
>>> Decimal('4.20') % 1
Decimal('0.20')
Run Code Online (Sandbox Code Playgroud)

作为kindall 笔记的意见,你就必须转换本土float第一个为字符串.

  • @intuited:它不需要是十进制,它也适用于浮点数:`10.0/3 % 1` 至少在我的系统上 (2认同)
  • 您可以使用from_float而不是使用字符串.d = Decimal.from_float(1.2) (2认同)
  • @MatthewPurdon - 如果您使用 `Decimal.from_float(1.2)` (现在可以写为 `Decimal(1.2)`),您将遇到舍入问题,这是这个答案试图避免的。 (2认同)

lll*_*kke 24

一个简单的方法:

number_dec = str(number-int(number))[1:]
Run Code Online (Sandbox Code Playgroud)

  • 为读者练习:使其适用于大于或等于10的数字 (24认同)
  • Downvote因为这是一种不必要的复杂方法.我寻求的答案是下一个答案,`5.55%1`,这也是一个更普遍有用的答案 - 可以在多种语言中使用模除法,而上述答案是特定于Python的. (21认同)
  • `number_dec = str(number-int(number)).split('.')[1]` (10认同)
  • `str(5.55 - int(5.55))[1:]`返回`.5499999999999998`而不是问题中提到的`.55`. (8认同)
  • 如果性能对您的应用程序很重要,基于字符串的解决方案很糟糕 (3认同)
  • **注意:**此解决方案返回一个包含点(".55``)的字符串,由于标题问题,您可能不会期望这个字符串! (2认同)

Jur*_*obl 6

尝试Modulo:

5.55%1 = 0.54999999999999982
Run Code Online (Sandbox Code Playgroud)


Kev*_*ent 5

import math
orig = 5.55
whole = math.floor(orig)    # whole = 5.0
frac = orig - whole         # frac = 0.55
Run Code Online (Sandbox Code Playgroud)


yos*_*e_k 5

类似于接受的答案,使用字符串更简单的方法是

def number_after_decimal(number1):
    number = str(number1)
    if 'e-' in number: # scientific notation
        number_dec = format(float(number), '.%df'%(len(number.split(".")[1].split("e-")[0])+int(number.split('e-')[1])))
    elif "." in number: # quick check if it is decimal
        number_dec = number.split(".")[1]
    return number_dec
Run Code Online (Sandbox Code Playgroud)


Alb*_*ieu 5

要使其适用于正数和负数:尝试 abs(x)%. 对于负数,没有 with abs,它会出错。

5.55 % 1

输出 0.5499999999999998

-5.55 % 1

输出 0.4500000000000002