我在 php 和 javascript 中看到过这个问题。我有这个号码:float 0.699
如果我这样做:0.699 x 100 = 69.89999999999999
为什么?
编辑
round(0.699 x 10, 2)
: 浮动 69.90000000000001
我在 php 和 javascript 中看到过这个问题。我有这个号码:float 0.699
如果我这样做:0.699 x 100 = 69.89999999999999
为什么?
编辑
round(0.699 x 10, 2)
: 浮动 69.90000000000001
浮点运算并不精确。
有关该问题的更深入讨论,请参阅Wikipedia 上的浮点数。
这是过去帮助过我的。它与事物在二进制中的表示方式有很大关系。基本上,二进制长话短说,对于所有大数的实数,没有一个确切的数字。
下面的链接将为您更详细地描述。
这将在任何语言中发生。浮点数与计算机上的所有其他内容一样,以二进制形式存储。数字 0.699 虽然可以用十进制精确表示,但可能是二进制重复的十进制,因此它不能以精确的精度存储。
查看wikipedia 条目以了解浮点数的存储方式以及发生这种情况的原因。
Javascript 数字是浮点数。
看看The complete javascript number reference。摘抄:
Javascript 中的所有数字都是 64 位(8 字节)浮点数,在撰写本文时产生的有效范围为 5e-324(负)到 1.7976931348623157e+308(正)(这最终可能会更改为 128 位)未来随着 64 位处理器变得司空见惯和 ECMA 标准的发展)。
整数被认为是可靠的(没有句点或指数符号的数字)到 15 位 (9e15) 1。浮点数被认为是尽可能可靠的,仅此而已!对于货币操纵,这是一个特别重要的概念,因为 0.06 + 0.01 解析为 0.06999999999999999 而不是 0.07。
看看Floating Point,特别是关于 IEEE 754 和可表示数字的部分。
这种行为可以在许多编程语言中重现,包括 C++ 和汇编。原因是 FPU 使用的浮点格式。您可以在此处阅读详细信息:
http://www.arl.wustl.edu/~lockwood/class/cs306/books/artofasm/Chapter_14/CH14-1.html#HEADING1-19
一般规则:永远不要期望浮点运算的确切结果。永远不要比较两个浮点数,使用区间,例如:而不是测试 f1 == f2,使用 f1 > (f2 -e) 和 f1 < ( f2 + e ),e 是一些小的值。