避免在python中舍入float

时间:2014-02-21 00:43:39

标签: python

我有非常不寻常的要求,但我希望有人可以提供帮助。

我将浮点数附加为numpy数组的值。 我想确保当小数部分以0结尾时浮点数不会被舍入。 例如: 我想在阵列中漂浮31.30以保持31.30,但我现在经历的是它被设置为31.3。

我想确保浮点数没有改变的原因是后来我将它拆分为两个整数(31.30到31和30),对我来说两个整数都具有'完整'值非常重要

有没有办法解决这个问题?我尝试制作这些浮点字符串,但我的问题是我需要比较数组与这些浮点数和numpy.array_equal()似乎不适用于字符串数组...

非常感谢任何帮助,

祝福

2 个答案:

答案 0 :(得分:2)

由于31.331.30的数字完全相同,因此无法区分它们。但我想你无论如何都不需要。这似乎更像是格式化问题。如果你总是希望点后两位数:

from math import floor

x = 31.3

whole_part = int(floor(x))
two_after_dot = int(floor(x*100))-whole_part*100

print(whole_part, two_after_dot)

输出:

31 30

如果实际情况并非如此,并且点后面的位数应该变化,同时保持不同数量的尾随零,则不能使用数字类型。而是从一开始就使用字符串。

答案 1 :(得分:0)

当由于将毫秒引用转换为微秒而遇到类似问题时,我不得不转换为字符串并在字符串上循环添加所需的0,直到字符串的长度正确为止。然后当值转换回整数时,计算就可以了。

The data will be passed to strptime as as string
vals = vals.split('.') # a fractional part of the seconds
nofrag, frag = vals
length = len(frag)
# This converts the fractional string to microseconds, given unknown precision
if length > 6:
  frag = frag(0:5)
else:
  while length < 6:
    frag = frag + '0'
    length += 1
# strptime requires even seconds with microseconds added later
nofrag_dt = DT.datetime.strptime(nofrag, '%Y%m%d %H%M%S')
dt = nofrag_dt.replace(microsecond=int(frag))
return dt