当前位置: 首页 > 面试题库 >

对于大数,为什么整数除法和除法转换为int的结果不同?

锺超英
2023-03-14
问题内容
print(10**40//2)
print(int(10**40/2))

代码输出:

5000000000000000000000000000000000000000
5000000000000000151893014213501833445376

为什么值不同?为什么第二个输出print()看起来如此?


问题答案:

的浮点表示10**40//2形式不正确:

>>> format(float(10**40//2), '.0f')
'5000000000000000151893014213501833445376'

那是因为浮点算法只是一种近似,尤其是当您超出了CPU可以准确建模的范围时(因为浮点是在硬件中处理的)。

整数除法10**40不必将数字表示为浮点数,它只需要除以整数即可,在Python中整数可以任意增大而不会造成精度损失。

另请参阅:

  • 浮点算法: Python教程中的 问题和局限性
  • 每个程序员应了解的浮点运算法则
  • 每个计算机科学家都应了解的浮点运算法则

如果必须使用更高精度的浮点算法,也请查看decimal模块。



 类似资料:
  • 问题内容: 考虑以下代码: 编译产生错误 因为表达式i / j的类型显然是int,因此必须将其强制转换为short。 为什么类型不短? 问题答案: 从Java规范: 5.6.2二进制数值提升 当运算符将二进制数值提升应用于一对操作数时,每个操作数必须表示一个数值类型的值,以下规则按顺序适用,并根据需要使用加宽转换(第5.1.2节)来转换操作数: 如果一个操作数的类型为double,则另一个将转换为

  • 与许多语言一样,Swift的除法运算符默认为整数除法,因此: 如果要进行浮点除法,必须执行以下操作 同样,与大多数其他语言一样,您不能强制转换整个操作: 发生这种情况是因为swift执行1和2的整数除法()并获得0,然后它尝试将其转换为,有效地为您提供0.0。 我很好奇为什么以下方法会奏效: 我觉得这应该会产生与双倍(1/2)相同的结果。为什么不呢?

  • 问题内容: 5年前关闭。 我必须将两个整数相除并得到一个浮点数作为我的代码: 我用调试器检查值 为什么结果为0.0?我应该怎么做才能获得正确的浮动? 问题答案: 当您将两个数相除时,将执行整数除法,在这种情况下,将导致22/64 =0。只有完成此操作后,您才能创建一个。和的表示是。如果要执行浮点除法,则应 在 除法 之前进行 强制转换:

  • 问题内容: 我是一个初学者,有些东西对我来说意义不大。请如此友善地解释我要去哪里错了。对不起,如果以前已经问过这个问题。 在此,小数点的存在意味着将使用浮点除法对它们进行评估。 显然,以下是“截断整数除法”的示例。对我来说似乎有点奇怪,但是还可以。 可以这样说吗:“在下面的行中,(双精度)强制转换被求值为1。它有效地表示:”将1/3视为双精度-不要使用截断整数除法。而是使用浮点除法。“” 在下面,

  • 问题内容: 我在考虑使用C#或Java之类的语言时如何显示分页控件。 如果我有x个项目想要以每页y个块的形式显示,那么需要多少个页面? 问题答案: Ian提供的整数数学解决方案很好,但存在整数溢出错误。假设变量为all ,则解决方案可以重写为使用数学运算并避免错误: 如果为,则错误仍然存​​在。模数解决方案没有错误。