繁体   English   中英

以浮点数向下移动点

[英]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并且它显然不起作用:-)

有没有办法解决它,或任何其他技术或其他方式来递归? 我允许使用任何我所需要的,但它必须是递归的:没有forwhile ...

谢谢您的帮助!! 我的第一语言不是英语,所以请原谅,如果难以阅读的话......

浮点表示具有该问题。

你想改变:

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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM