我试图在Python中截断一个十进制值。我不想舍入它,而只是显示小数值达到指定的精度。我尝试了以下方法:
d = 0.989434
'{:.{prec}f}'.format(d, prec=2)
这使其达到0.99。但我实际上希望输出为0.98。显然,round()
不是一种选择。有没有办法做到这一点?或者我应该回到代码并将所有内容更改为decimal
?
感谢。
答案 0 :(得分:9)
您可以使用以下代码
import decimal
d = 0.989434
print decimal.Decimal(d).quantize(decimal.Decimal('.01'), rounding=decimal.ROUND_DOWN)
答案 1 :(得分:7)
我不了解您的所有要求,但这将非常强大。
>> before_dec, after_dec = str(d).split('.')
>> float('.'.join((before_dec, after_dec[0:2])))
0.98
这个答案不健全或数学上不正确。有关使用Decimal.quantize
方法执行此操作的正确方法,请参阅Nilani Algiriyage's answer below。
答案 2 :(得分:4)
d = 0.989434
print floor(d * 100) / 100
Math.floor(x)将x的底限作为float返回,即最大整数 值小于或等于x。
移动小数点左边的2位小数'。',地板,然后移回'。'右边的数字。
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
答案 3 :(得分:3)
将其格式化为更长的时间,然后切断多余的数字:
def truncate(f, digits):
return ("{:.30f}".format(f))[:-30+digits]
答案 4 :(得分:3)
这是我相信的最佳方式。
将移动的位数向左移动到右侧
d = 0.989434
print "{0:0.2f}".format(int(d * 100)/100.0)
<强>输出强>
0.98
答案 5 :(得分:2)
import math
d = 0.989434
prec = 2
output = math.floor(d * (10 ** prec)) / (10 ** prec)
如果您仍然需要十进制变量而不是字符串
答案 6 :(得分:2)
与其他一些答案相似,但没有任何进口
def truncate(x, d):
return int(x*(10.0**d))/(10.0**d)
>>>truncate(0.987654, 2)
0.98
答案 7 :(得分:1)
还有数学:
d = 0.989434
x = int(d * 100.0) / 100.0
print "{0:0.2f}".format(x)
答案 8 :(得分:1)
在这种情况下,下面的代码将打印0.98,但是您必须小心您的d值不会大于或等于10,因为它只会打印,因为例如,10.1而不是10.12。
d = 0.989434
print '{:.{prec}s}'.format(str(d), prec=4)
答案 9 :(得分:1)
str
:
d = str(0.989434)
print float(d[:d.find('.')+3])
答案 10 :(得分:1)
如果您只需要显示,可以将其转换为字符串并对其进行切片:
d = 0.989434
print str(d)[0:4] #or print(str(d)[0:4])
答案 11 :(得分:0)
在此链接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)]
在leat它不需要加载任何模块也不需要新的计算。到目前为止,它解决了公共债券价格计算中截断要求的问题。