MySql 并在我根据 php 的查询更新时浮动或双重裁剪我的号码

MySql and float or double crop my number when I update it per query from php

我喜欢使用 InnoDB 以非常精确的方式将纬度和经度存储到我的 MySql 数据库中。但是,float 没有提供足够的内部小数位,所以我改用 double。我有点想知道 MySql 接受了最大 30 的 double 所以我使用了 double(30,27) 因为只需要 3 个常规位置,其余的必须在逗号后面。

好吧,在 MySql 中,到目前为止工作正常,而在另一侧,我收到 json_decode 上的浮点数,当我回显它们时,逗号后最多有 18 或 19 个位置。所以即使在这里一切都如预期的那样。

但是,当我构建一个更新查询来填充空的双精度字段(双精度 30/27)时,它只会用零填充所有数字,前 9 位除外。 或者有时会打破规则从第 7 位开始,一行 9。

例如,当我在 mysql 中更新 47.2608691999999877 时 – 无论是每个脚本还是每个 PhpMyAdmin,在单击保存按钮后 47.260869199999990000000000000 出现在 table 中,其中 47.2608691999999987700=00000=00000 ]

11.396251100000000633 作为 table 的更新给了我一个 11.396251100000000000000000000

所以看起来它忽略了从 7 开始的可能位置。或者有时用 9 填充它,但在大多数情况下只有零。

请问有人可以给我一些解决这个问题的小费吗?
请记住,我也遇到了 PHPMyAdmin 的问题,但它是由 PHP 组成的。现在我不确定这是 MySQL 还是 PHP 问题。

谢谢

例如 我 MYSql 我可以很容易地存储它,例如 PHPMyAdmin:

我不相信 lat/long 存储的任何浮点数,您几乎可以保证立即出现舍入错误。浮点数根本就不那么准确。

你有没有考虑过一个定点整数(47.2608691999999877 变成 472608691999999877 当需要显示/从输入返回时乘以和除以 1000000000000000(或者甚至只是简单地执行字符串操作来显示。)

该比例的数字应该相当适合 64 位整数的范围(地狱,你甚至可以得到小数点后第 17 位并且仍然没问题:P。)

你的脚本和 PHPMyAdmin 在 PHP 上写了它使用精度来 显示 浮点数,但是 mysql 和 php 尽可能准确地处理数字。

尝试更改您的 .ini 精度设置:http://php.net/manual/ru/ini.core.php#ini.precision

注意 DOUBLE(30, 27) 如何对 16-17 位有效数字有意义,然后就乱套了吗?

FLOAT 有 24 位精度。这对于大约 7 位有效数字来说足够了。特别是对于纬度和经度,精度足以达到 1.7 米(5.6 英尺)以内。对于大多数 lat/lng 应用程序,这就足够了。因此,插入时出现舍入错误(从十进制转换为二进制)和读取时出现另一个错误(转换回十进制)并不重要。

DOUBLE 有 53 位精度,大约 16 位有效数字 -- 3.5 纳米南北或东西!

DOUBLE(30, 27) -- 插入时,它说 (1) 舍入到小数点后 27 位,(2) 舍入到 53 位精度。阅读时,它会颠倒步骤,导致你有奇怪的混乱。

我从未见过在 FLOAT 或 DOUBLE 上使用 (M,N) 的有效需求。别这样。

对于 DECIMAL(M,N),您正在存储 正好 适合 N 位小数的内容。对于 lat/lng 目的,请考虑纬度的 DECIMAL(6,4) 和经度的 (7,4) -- 16 米(52 英尺)。或者,为了更精确,(8,6) 和 (9,6) -- 16 厘米(6 英寸)。

进一步注意,FLOAT 需要 4 个字节(总是),DOUBLE:8,DECIMAL(6,4):3,(7,4):4,(8,6):4,(9,6 ): 5. 如果您有数十亿个 lat/lng 条目,则存储字节加起来。