1

可能的重复:
为什么 99.99 / 100 = 0.9998999999999999
处理浮点数的精度问题

我在 php 和 javascript 中看到过这个问题。我有这个号码:float 0.699

如果我这样做:0.699 x 100 = 69.89999999999999

为什么?

编辑

round(0.699 x 10, 2): 浮动 69.90000000000001

4

6 回答 6

10

浮点运算并不精确。

有关该问题的更深入讨论,请参阅Wikipedia 上的浮点数。

于 2010-06-01T14:07:12.017 回答
5

这是过去帮助过我的。它与事物在二进制中的表示方式有很大关系。基本上,二进制长话短说,对于所有大数的实数,没有一个确切的数字。

下面的链接将为您更详细地描述。

每个计算机科学家都应该知道的关于浮点运算的知识

于 2010-06-01T14:11:59.900 回答
2

这将在任何语言中发生。浮点数与计算机上的所有其他内容一样,以二进制形式存储。数字 0.699 虽然可以用十进制精确表示,但可能是二进制重复的十进制,因此它不能以精确的精度存储。

查看wikipedia 条目以了解浮点数的存储方式以及发生这种情况的原因。

于 2010-06-01T14:11:01.533 回答
1

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。

于 2010-06-01T14:09:44.477 回答
0

看看Floating Point,特别是关于 IEEE 754 和可表示数字的部分。

于 2010-06-01T14:12:44.610 回答
0

这种行为可以在许多编程语言中重现,包括 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 是一些小的值。

于 2010-06-01T14:15:24.650 回答