【问题标题】:Moving the point downwards in a floating point number在浮点数中向下移动点
【发布时间】:2011-07-24 17:27:47
【问题描述】:

首先,感谢您的关注,我是这个网站的新手^^ 如果我做错了什么,请原谅...

我的 Python 代码有一个大问题...我是编程新手,我也是 Python 新手。

我需要取一个浮点数并将该点向右移动,使其变成一个整数,例如取 60.27 并得到 6027。

我使用的算法是递归地乘以num*10 直到num%2==0,然后得到int(num)

问题是,当我乘以(例如)602.47*10 时,它会返回 6024.700000000001,它显然不起作用 :-)

有没有办法修复它,或者任何其他技术或其他方式来递归地做到这一点?我可以使用我需要的任何东西,但它必须是递归的:没有 forwhile...

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

【问题讨论】:

    标签: python recursion floating-point integer


    【解决方案1】:
    >>> str(60.27).translate(None, '.')
    '6027'
    

    使用lstrip('0') 防止小数小​​于1。


    来自文档:

    S.translate(table [,deletechars]) -> 字符串

    返回字符串 S 的副本,其中出现的所有字符 在可选参数中删除字符被删除,并且 剩余的字符已通过给定的映射 翻译表,必须是长度为256的字符串。

    【讨论】:

    • 谢谢!!我用了.replace,但是这个.translate方法似乎非常有用^^
    【解决方案2】:

    浮点表示存在这个问题。

    你想改变吗:

    1.2345
    12.345
    123.45
    1234.5
    

    全部到 12345?

    对于没有精确表示的浮点数(您提到 6024.70),您是否期望得到 6024700000000001,因为这是可以存储在浮点数中的最接近 6024.70 的输出?

    【讨论】:

    • 这正是我遇到的问题^^,正如其他人建议的那样,我将其解析为 str 并简单地删除了浮点...谢谢!
    【解决方案3】:

    你可以试试这样的:

    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
    

    【讨论】:

    • 谢谢!最后我使用了.replace,因为性能真的不是问题^^
    【解决方案4】:

    将数字解析为字符串并进行字符串操作的算法会更可靠。正如您所见证的,任何涉及浮点数的数值计算都必然是不准确的。没有办法解决这个问题。

    【讨论】:

    • 感谢您的帮助 ^^ 这就是我最终使用的方法,将数字解析为 str 并使用 .replace,正如其他人建议的那样......谢谢!
    【解决方案5】:

    由于你不能(可靠地)使用浮点数来做你想做的事,一个简单的技巧是将数字转换为字符串,然后去掉小数点:

    int(str(num).replace('.',''))
    

    这适用于任何未以科学记数法表示的数字。如果您的数字足够大(或小)以至于它们最终以科学记数法表示,请查看this

    【讨论】:

      【解决方案6】:

      在这里只是在黑暗中冒险,但是您的数字是否代表您尝试在(例如)美元和美分之间转换的金额?如果是这样,您需要停止您正在做的事情并将一切转换为美分,并且仅在实际向用户展示事物时使用“美元”值。对货币值使用浮点数是一个非常非常糟糕的主意。

      如果没有,请忽略我:-)

      【讨论】:

      • 感谢您的帮助...实际上,我需要做的是将浮点数验证为某个基数,例如:将 11.1112 验证为基数 2 将是 False,例如...
      猜你喜欢
      • 2023-03-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-03-08
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多