在python中截断

时间:2011-03-02 14:21:08

标签: python

如何在python的第10个小数位后截断(不舍入)给定数字的立方根?

例如:

如果数字 8 ,所需输出 2.0000000000 33076161 321.0000000000

4 个答案:

答案 0 :(得分:2)

缩放 - 截断 - 不缩放:

n = 10.0
cube_root = 1e-10 * int(1e10 * n**(1.0/3.0))

答案 1 :(得分:2)

在打印结果时,您应该只进行此类截断(除非您有其他严重的原因)。浮点格式没有精确的二进制表示形式,对于每个日常十进制值的主机:

print 33076161**(1.0/3.0)

计算器为您提供的答案与Python提供的答案不同。甚至Windows计算器在cuberoot(33076161)上做了一个可以通过的工作,而python给出的答案将完全不正确,除非你使用舍入。

因此,您提出的问题从根本上说是无法回答的,因为它假设浮点数学中不存在的功能。

错误答案#1:这实际上是舍入而不是截断,但是对于您指定的情况,它提供了正确的输出,可能是由于舍入补偿了在#2中遇到的固有浮点精度问题:

print "%3.10f" % 10**(1.0/3.0)

错误的答案#2:但是你可以截断(作为一个字符串)一个11位数的舍入值,正如我所指出的那样,对于非常接近翻转的值,以及其他奇怪的方式会失败,所以DON '做到这一点:

print ("%3.11f" % 10**(1.0/3.0))[:-1]

合理关闭答案#3:我写了一个仅用于显示的小功能:

import math
def str_truncate(f,d):
    s = f*(10.0**(d))
    str = `math.trunc(s)`.rstrip('L')
    n = len(str)-d
    w = str[0:n]
    if w=='':
        w='0'
    ad =str[n:d+n]
    return w+'.'+ad



d =  8**(1.0/3.0)
t=str_truncate(d,10)
print 'case 1',t

d =  33076161**(1.0/3.0)
t=str_truncate(d,10)
print 'case 2',t

d =  10000**(1.0/3.0)
t=str_truncate(d,10)
print 'case 3',t

d = 0.1**(1.0/3.0)
t=str_truncate(d,10)
print 'case 4',t

请注意,由于友好的邻域浮点精度是非无限的,因此Python无法完全按照您的预期执行#2。

您也应该了解这份文件:

What Every Computer Scientist Should Know About Floating Point

您可能有兴趣知道Python具有提供arbitary precision功能的附加组件,这些功能允许您将某些内容的多维数据集根计算为您可能需要的任意数量的小数。使用像mpmath这样的软件包,您可以摆脱传统浮点数学的精度限制,但性能(速度)会相当高。

有趣的是,内置的十进制单位不能解决这个问题,因为1/3是十进制的有理(重复)但非终止的数字,因此无法以十进制精确表示符号,也不是浮点数:

 import decimal
 third = decimal.Decimal(1)/decimal.Decimal(3)
 print  decimal.Decimal(33076161)**third  # cuberoot using decimal

输出:     320.9999999999999999999999998

更新:Sven提供了Logs的这个很酷的用途,适用于这种特殊情况,它输出所需的321值,而不是320.99999 ...:Nifty。我喜欢Log()。然而,这适用于321立方,但在320立方的情况下失败:

 exp(log(33076161)/3)

分数似乎没有解决这个问题,但我希望它能做到:

import fractions

third = fractions.Fraction(1,3)

def cuberoot(n):
    return n ** third

print '%.14f'%cuberoot(33076161)

答案 2 :(得分:0)

num = 17**(1.0/3.0)
num = int(num * 100000000000)/100000000000.0
print "%.10f" % num

答案 3 :(得分:0)

这段代码怎么样..我创建它供个人使用。虽然它很简单,但它运作良好。

def truncation_machine(original,edge):
'''
Function of the function :) :
    it performs truncation operation on long decimal numbers.
Input:
    a) the number that needs to undergo truncation.
    b) the no. of decimals that we want to KEEP.
Output:
    A clean truncated number.
Example: original=1.123456789
         edge=4
         output=1.1234
'''
import math
g=original*(10**edge)
h=math.trunc(g)
T=h/(10**edge)
print('The original number ('+str(original)+') underwent a '+str(edge)+'-digit truncation to be in the form: '+str(T))
return T