[英]Moving the point downwards in a floating point number
首先,感谢关注,我是这个网站的新手^^所以请原谅我,如果我做错了什么...
我的Python代码存在很大问题......我是编程新手,而且我也是Python的新手。
我需要取一个浮点数并将该点向右移动,使其变为整数,如取60.27并得到6027。
我正在使用的算法递归地乘以num*10
直到num%2==0
,然后得到int(num)
。
问题是,当我乘以(例如) 602.47*10
它返回6024.700000000001
并且它显然不起作用:-)
有没有办法解决它,或任何其他技术或其他方式来递归? 我允许使用任何我所需要的,但它必须是递归的:没有for
或while
...
谢谢您的帮助!! 我的第一语言不是英语,所以请原谅,如果难以阅读的话......
浮点表示具有该问题。
你想改变:
1.2345
12.345
123.45
1234.5
全部到12345?
对于没有确切代表的浮标(你提到6024.70),你期望得到6024700000000001,因为这是最接近6024.70的输出,可以存储在浮点数中吗?
>>> str(60.27).translate(None, '.')
'6027'
使用lstrip('0')
来防止低于1的小数。
来自文档:
S.translate(table [,deletechars]) - > string
返回字符串S的副本,其中删除了可选参数deletechars中出现的所有字符,其余字符已通过给定的转换表进行映射,转换表必须是长度为256的字符串。
将数字解析为字符串并进行字符串操作会更加可靠。 正如您所见,任何涉及浮点数的数值计算都必然会产生不准确性。 没有解决这个问题。
既然你不能(可靠地)使用浮点来做你想做的事情,那么一个简单的黑客就是将数字转换为字符串然后撕掉小数点:
int(str(num).replace('.',''))
这适用于任何未用科学记数法表示的数字。 如果你的数字很大(或很小)足以使它们最终用科学记数法表示,那么看看这个 。
你可以尝试类似的东西:
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
只是在黑暗中采取疯狂的刺,但你的数字代表你试图在(比方说)美元和美分之间转换的金额? 如果是这样,您需要停止正在进行的操作并将所有内容转换为美分,并且在实际向用户呈现内容时仅使用“美元”值。 使用浮点数表示货币价值是一个非常非常糟糕的主意。
如果没有,请不要理我:-)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.