我在MySQL浮点列中插入一个浮点值1223473,当我将其返回时,该值更改为1223470。
Input: 1223473.0 (0x49955988)
Output: 1223470.0 (0x49955970)
AVG: 1223473.0 (0x49955988)
MIN: 1223473.0 (0x49955988)
MAX: 1223473.0 (0x49955988)
+0: 1223473.0 (0x49955988)
*1: 1223473.0 (0x49955988)
CAST: 1223473.0 (0x49955988)
这是输出:
System.out.println(1223473f == 1223470f); // gives false
System.out.println(123456789f == 123456791f); // gives true (too many digits)
使用MySQL客户端可以看到相同的行为。
我无法解释为什么输入值与输出不同。而且,为什么申请手术会给出正确的价值呢?即使有其他值,我也会得到相同的行为。例如,如果我使用1223472而不是122473,则输出值将为1223470.它看起来像精度损失。但是为什么在它上面应用一个操作会准确地返回输入值?看起来MySQL的存储精度比它显示的更精确。
对于人们试图在浮动中放置太多数字的浮点类型,这看起来不像是典型的误解:
mysql> create table ttt (value float);
Query OK, 0 rows affected (0.04 sec)
mysql> INSERT INTO ttt VALUES (1223473);
Query OK, 1 row affected (0.00 sec)
mysql> select * from ttt;
+---------+
| value |
+---------+
| 1223470 |
+---------+
1 row in set (0.00 sec)
mysql> SELECT * FROM ttt WHERE value = 1223470;
Empty set (0.00 sec)
mysql> SELECT * FROM ttt WHERE value = 1223473;
+---------+
| value |
+---------+
| 1223470 |
+---------+
1 row in set (0.00 sec)
最后,我不知道该怎么想......
$squery = "SELECT * FROM vesti";
$rsquery = mysqli_query($db,$squery);
while($svevesti = mysqli_fetch_asssoc($rsquery){
// action here
}
为什么价值会发生变化?
答案 0 :(得分:1)
您使用float
作为数据类型。您没有足够的精度来表示1223473.0。浮点数也受制于平台或实现依赖性"根据{{3}}。
将列上的数据类型更改为double
(或decimal
),这样可以解决您的问题。请参阅MySQL documentation进行确认。
在对float
或double
的值执行时,汇总this SQLFiddle值等函数。从文档中可以清楚地看出,但我强烈怀疑在使用MIN
,MAX
,+ 0
或* 1
时也是如此在数据类型中,可以"保存结果值"。
您应该知道浮点运算应该在SUM, AVG, return a double
(即阈值)内进行,也可以按照MySQL文档的规定进行。