首先,感谢关注,我是这个网站的新手^^所以请原谅我,如果我做错了...
我的Python代码存在很大问题......我是编程新手,而且我也是Python的新手。
我需要取一个浮点数并将该点向右移动,使其变为整数,如取60.27并得到6027.
我正在使用的算法递归地将num*10
乘以num%2==0
,然后得到int(num)
。
问题是,当我乘以(例如)602.47*10
时,它会返回6024.700000000001
并且它显然不起作用: - )
有没有办法解决它,或任何其他技术或其他方式来递归?我被允许使用我需要的任何东西,但它必须是递归的:没有for
或while
......
感谢您的帮助!!我的第一语言不是英语,所以请原谅,如果难以阅读......
答案 0 :(得分:2)
浮点表示具有该问题。
您是否想要改变:
1.2345
12.345
123.45
1234.5
全部到12345?
对于没有确切代表的浮点数(你提到6024.70),你期望得到6024700000000001,因为这是最接近6024.70的输出,可以存储在浮点数中吗?
答案 1 :(得分:2)
>>> str(60.27).translate(None, '.')
'6027'
使用lstrip('0')
防止小数点低于1。
来自文档:
S.translate(table [,deletechars]) - >串强>
返回字符串S的副本,其中包含所有字符 在可选参数中删除deletechars,并且 剩余的字符已通过给定的映射 转换表,必须是长度为256的字符串。
答案 2 :(得分:1)
将数字解析为字符串并进行字符串操作会更加可靠。正如您所见,任何涉及浮点数的数值计算都必然会产生不准确性。没有解决这个问题。
答案 3 :(得分:1)
由于你不能(可靠地)使用浮点来做你想要的,一个简单的黑客是将数字转换为字符串然后撕掉小数点:
int(str(num).replace('.',''))
这适用于任何未用科学记数法表示的数字。如果你的数字很大(或很小),最终用科学记数法表示,请看this。
答案 4 :(得分:1)
您可以尝试以下方式:
x = 60.27
newx = int(str(x).replace('.',''))
编辑:作为旁注,字符串.replace
和.translate
对于各种大小的浮动广告具有相似的性能
%timeit int(str(4.73285).replace('.',''))
100000 loops, best of 3: 2.65 us per loop
%timeit int(str(4.73285).translate(None, '.'))
100000 loops, best of 3: 3.02 us per loop
答案 5 :(得分:1)
在这里黑暗中采取疯狂的刺,但你的数字代表你试图在(比方说)美元和美分之间转换的金额吗?如果是这样,您需要停止正在执行的操作并将所有内容转换为美分,并在实际向用户呈现内容时仅使用“美元”值。使用浮点数表示货币价值是一个非常非常糟糕的主意。
如果没有,请忽略我: - )