【问题标题】:Python limit decimal places to specific position (not round)Python将小数位限制为特定位置(不是四舍五入)
【发布时间】:2017-05-25 18:32:13
【问题描述】:

我想将限制小数位数减少到特定位置(不是四舍五入)。例如 1.555 到 1.55 而不是 1.56。 pandas 或 numpy 没有更好的/内置方式吗?这是我能想到的唯一方法。

import numpy as np

a = np.array([1.555, 2.559])

precision = 2
adj = 10 ** precision
np.floor(a * adj) / adj

array([ 1.55,  2.55])

【问题讨论】:

  • 这可能会有所帮助:您要查找的术语是 truncation
  • 是的,看到了这个链接,但那是 8 年前的事了。所以我想现在可能有更好的方法。我也可以做float('%.2f'%(1.555)),但似乎不是最聪明的事情。
  • 问题的年龄无关紧要。如果它与您的问题相同,那么您的问题是重复的。但是,您的问题完全不一样,因为您要问是否有更好的方法在pandas 或numpy 中。
  • 是的,从那时起,'pandas' 和 ''numpy' 中添加了很多新功能。所以我想现在可能有一个不错的方法。

标签: python pandas numpy decimal


【解决方案1】:

对于数组,您不想使用字符串格式化方法。

In [175]: a = np.array([1.555, 2.559])
In [176]: a*100
Out[176]: array([ 155.5,  255.9])
In [177]: (a*100).astype(int)
Out[177]: array([155, 255])
In [178]: (a*100).astype(int)/100
Out[178]: array([ 1.55,  2.55])

由于浮点数不准确,您可能会得到一些“错误”的结果,即截断的值会偏离一个数字。


一个小的“守卫”值可能就足够了(如果某些值为负数,则必须是一个具有相应正负值的数组):

In [179]: (a*100+.01).astype(int)/100
Out[179]: array([ 1.55,  2.55])

一个有点人为的保护值测试用例:

In [65]: a = np.array([1.555, 2.559, 1.25-1e-10])
In [66]: a
Out[66]: array([ 1.555,  2.559,  1.25 ])
In [67]: (a*100).astype(int)/100
Out[67]: array([ 1.55,  2.55,  1.24])
In [68]: (a*100+.01).astype(int)/100
Out[68]: array([ 1.55,  2.55,  1.25])

【讨论】:

  • hpaulj... 你会是个好人问。既然您提到浮点数不准确,并且我们放弃了我们对它应该是的期望,那么我们不能来回做一些位移来完成这项工作吗?
  • 我非常感谢我们必须小心浮动。他们是非常狡猾的野兽。但是,在不使用保护值时,您是否真的遇到过非一的结果?你能构建一个需要保护值的案例吗?如果可以的话,那么你怎么知道保护值不会在另一边创建异乎寻常的结果?浮点数在以 10 为底的意义上并不“精确”,这是真的。但是我们也乘以 10 的幂和除以。只要我们不接近精度的边缘(例如,要求 float32 值的 7 位十进制数字),“提升”数字不应该可以吗?
  • 在这种情况下,我只是猜测这可能是一个问题;我不能立即构建一个例子。
  • 那么我认为添加一个保护值不是一个好主意。只是在不完全理解的情况下随机添加一个任意值,当您不想要它时,将结果推送到下一个更高数字的机会与将结果推送到下一个更高的数字,当你想要的时候。
  • 我加了一个例子。
【解决方案2】:

拆分号码。使用 n-int(n) 获取小数部分并将其转换为字符串,截断,返回浮点数。添加到 int 部分。

n = 553.98896
int(n)+float(str(n-int(n))[1:4])

返回

553.98

【讨论】:

    【解决方案3】:

    你可以用肮脏的方式来做:

    val = 12.5555
    
    sVal = str(val)
    
    i = sVal.index('.')
    
    val = float(sVal[0:i] + sVal[i:i+3])
    
    print(val)
    

    Live demo

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-07-19
      • 1970-01-01
      • 2023-03-24
      • 1970-01-01
      • 2014-02-10
      • 2011-03-09
      • 1970-01-01
      相关资源
      最近更新 更多