为什么"9999999999999999 / 16 = 625000000000000.0"而"9999999999999999 // 16 = 624999999999999"



我真的不明白这背后的数学,有人能帮我理解吗?为什么它们不返回相同的数字?

>>> 9999999999999999 / 16
625000000000000.0
>>> 9999999999999999 // 16
624999999999999

Division和Floor Division有区别

"/";正常的浮点除法。

"//";楼层划分。

更多信息请查看什么是楼层划分

还要检查文档中这两个操作符之间的差异。

欢迎来到浮点数学的神奇世界!

你知道计算机用二进制来思考。你知道这意味着一个给定的位不是开就是关。你知道,如果你把这些加在一起,你可以得到数字- 0101 = 5。当你处理整数时,这是非常容易的。

当你处理整分数时——比如1/4或1/2——这也很容易。你为小数点保留一些位,这样就可以了。0101 01 = 5.5 maybe .

但是如何用二进制表示1/3呢?.333333重复。你不能,不准确。您可以说0 011 011 011 011 011 100 -每个11代表上面的小数点(因此。333334)。但是你必须把最后一位四舍五入来表示它之后的所有东西(或者我猜它可以四舍五入,我不记得它是怎么做的了——无论如何,它现在是一个"整数"小数,不再重复,因此……不再准确!!!!)

所以你来浮点数学。这些东西是复杂的,但足以说明的是,最终它是一个设计用于在二进制限制内进行复杂数学的系统,这样做快速并且最小的舍入问题。Q

快速是这里要注意的事情——你可以快速或准确地做,但不能两者兼而有之。对于标准的数据类型(如int/long/double/float),这对于编程中95%的数学运算来说已经足够了。

对于其他数据类型,如果你使用Decimal数据类型,你将有一个小得多的舍入误差(Decimal数据类型为小数点保留更多的位,允许它有更高的精度,因为舍入发生在一个比其他数字数据类型小得多的数字上)-注意,这仍然使用浮点数学!但是,由于在小数点后使用了更大的位数(在上面的1/3的示例中,我们使用了6位小数),因此它的计算精度更高。Decimal数据类型包含更多。

然后你有地板除法,正如这里的其他答案所指出的,这不是浮点数学-它的四舍五入不同!因此,你会得到一个不同的答案因为四舍五入那些远的小数点在二进制中没有被覆盖的策略是不同的!

相关内容

  • 没有找到相关文章

最新更新