【问题标题】:Truncate a decimal value in Python在 Python 中截断十进制值
【发布时间】:2013-12-30 22:27:29
【问题描述】:

我正在尝试在 Python 中截断十进制值。我不想四舍五入,而是只显示达到指定精度的十进制值。我尝试了以下方法:

d = 0.989434
'{:.{prec}f}'.format(d, prec=2)

这会将其四舍五入为 0.99。但我实际上希望输出为 0.98。显然,round() 不是一个选项。有没有办法做到这一点?还是我应该回到代码并将所有内容更改为decimal

谢谢。

【问题讨论】:

  • 嗯不确定是否有办法通过字符串格式化来做到这一点。我会做一些研究:)
  • 请提供更多答案。我们肯定需要更多。
  • 这不是decimal.Decimal,而是float

标签: python formatting decimal truncate


【解决方案1】:

您可以使用以下代码

import decimal
d = 0.989434

print decimal.Decimal(d).quantize(decimal.Decimal('.01'), rounding=decimal.ROUND_DOWN)

【讨论】:

    【解决方案2】:

    我不了解您的所有要求,但这将是相当强大的。

    >> before_dec, after_dec = str(d).split('.')
    >> float('.'.join((before_dec, after_dec[0:2])))
    0.98
    

    2018-01-03 编辑

    这个答案不可靠或数学上不正确。请参阅Nilani Algiriyage's answer below,了解使用Decimal.quantize 方法的正确方法。

    【讨论】:

    • after_dec[:2] 就够了:)
    • 确实是这样,但我相信约定在对方未知的情况下更有意义,即a_list[3:],所以我不太关注[0:2] vs @ 987654327@,以当时出现的为准:)
    • 你为什么接受这个作为解决方案? :) 我会发现一些基于数学的解决方案更强大!
    • 只是好奇 :) 我会亲自使用Decimal 或任何其他基于数学的解决方案! 我完全忘记了浮点字符串格式化说明符会进行舍入! :/
    • 如果我猜的话:他可能只想在一个号码上执行此操作,并且一旦他得到一个可行的解决方案,他就接受了它,而无需费心阅读其他号码......跨度>
    【解决方案3】:
    d = 0.989434
    print floor(d * 100) / 100
    

    Math.floor(x) 以浮点数形式返回 x 的下限,最大整数 值小于或等于 x。

    移动小数点“.”左边的两位小数,取地板,然后将“.”右边的数字向后移动

    100可以修改

    n = 2
    m = pow (10, n)
    d = 0.989434
    print floor(d * m) / m
    

    n 是您想要的精度。

    编辑: 如果 d 为负数,则必须使用 ceil 方法

    if d < 0:
        print ceil(d * m) / m
    else:
        print floor(d * m) / m
    

    【讨论】:

    • 请注意,对于d = -0.989434,这将打印-0.99
    【解决方案4】:

    将其格式化为更长的内容,然后剪掉多余的数字:

    def truncate(f, digits):
        return ("{:.30f}".format(f))[:-30+digits]
    

    【讨论】:

    • 效率低下,但这里唯一的答案似乎没有打破边缘情况。
    【解决方案5】:
    import math
    
    d = 0.989434
    prec = 2
    output = math.floor(d * (10 ** prec)) / (10 ** prec)
    

    如果你仍然想要一个十进制变量而不是字符串

    【讨论】:

    • 请注意,对于d = -0.989434,这将打印-0.99
    • @Eric 是的,你是对的!这来自floor 的定义。似乎最好使用字符串格式。 :)
    【解决方案6】:

    这是我认为最好的方式。

    1. 将有效数字向左移动
    2. 截断小数部分
    3. 将移动的位数向左、向右移动

      d = 0.989434
      print "{0:0.2f}".format(int(d * 100)/100.0)
      

      输出

      0.98
      

    【讨论】:

      【解决方案7】:

      str:

      d = str(0.989434)
      print float(d[:d.find('.')+3])
      

      【讨论】:

        【解决方案8】:

        如果你只需要显示,你可以将其转换为字符串并对其进行切片:

        d = 0.989434
        print str(d)[0:4] #or print(str(d)[0:4])
        

        【讨论】:

          【解决方案9】:

          在这种情况下,下面的代码将打印 0.98,但您必须小心,您的 d 值不会大于或等于 10,因为它只会打印,例如,10.1 而不是 10.12 .

          d = 0.989434
          print '{:.{prec}s}'.format(str(d), prec=4)
          

          【讨论】:

          • 我给了我一个错误......'str'类型的对象的未知格式代码'f'
          • 抱歉,我忘记在字符串格式中将 f 更改为 s。现在已经编辑过了。
          【解决方案10】:

          还有数学:

          d = 0.989434
          x = int(d * 100.0) / 100.0
          print "{0:0.2f}".format(x)
          

          【讨论】:

            【解决方案11】:

            与其他一些答案非常相似,但没有任何导入

            def truncate(x, d):
                return int(x*(10.0**d))/(10.0**d)
            
            >>>truncate(0.987654, 2)
            0.98
            

            【讨论】:

            • 很确定 int(x*(10.0**d))/(10.0**d) 在这里也能正常工作
            • 你完全正确!不知道为什么我没有看到:P 在您的允许下,我会更改或将其添加到答案中......
            • 我不会阻止你改变它!
            【解决方案12】:

            在这个链接here我发布了下面的解决方案:

            def truncate_number(f_number, n_decimals):
                  strFormNum = "{0:." + str(n_decimals+5) + "f}"
                  trunc_num = float(strFormNum.format(f_number)[:-5])
                  return(trunc_num)
            
            # Testing the 'trunc_num()' function
            test_num = 1150/252
            [(idx, truncate_number(test_num, idx)) for idx in range(0, 20)]
            

            至少它不需要加载任何模块,也不需要新的计算。到目前为止,它解决了我在公共债券价格计算中的截断要求问题。

            【讨论】:

              猜你喜欢
              • 2010-09-23
              • 2021-10-12
              • 1970-01-01
              • 2016-04-22
              • 1970-01-01
              • 2014-03-25
              • 2017-02-08
              • 1970-01-01
              • 2011-02-12
              相关资源
              最近更新 更多