【问题标题】:MariaDB SQL query returns truncated numbers from select statementMariaDB SQL 查询从 select 语句中返回截断的数字
【发布时间】:2020-09-23 23:20:00
【问题描述】:

我正在尝试从 Maria DB 中提取数据。架构中的数据类型是 DECIMAL (12, 8)。 在我的程序中,当我使用以下查询进行查询时。它截断到 4(或 3)位小数并四舍五入。

select CAST(FORMAT(latitude, 100) AS FLOAT) latitude from mytable

它返回 36.173 。在数据库中它存储为 36.17298200 我希望它返回为 36.172982

【问题讨论】:

  • 纬度是哪个类型字段?

标签: mysql sql mariadb truncate


【解决方案1】:

要在计算中使用数字,只需使用它。没有转化,没有CAST

要将其显示到小数点后 6 位,请在 SELECTing 上执行此操作:

SELECT FORMAT(latitude, 6) ...

FORMAT(..., 100) 应该给你很多小数位。

FLOAT 没有足够的精度来区分超过 6 或 7 个重要小数位。也就是说,第一个和第三个数字是FLOAT中最接近的可表示数字:

x4210b122 --> 36.172981262207
              36.17298200
x4210b123 --> 36.172985076904

双:

x40421624463065f9 --> 36.1729819999999975

纬度和经度:

FLOAT  has a resolution of 1.7 m or 5.6 ft -- good enough for Vehicles
DECIMAL(8,6)               16 cm    1/2 ft -- Friends in a mall

【讨论】:

    【解决方案2】:

    根据MySQL官方文档:

    DECIMAL 和 NUMERIC 类型存储精确的数字数据值。当保持精确的精度很重要时使用这些类型,例如货币数据。在 MySQL 中,NUMERIC 实现为 DECIMAL,因此以下关于 DECIMAL 的说明同样适用于 NUMERIC。

    Floating-Point Types (Approximate Value) - FLOAT, DOUBLE

    所以你应该写类似的东西:

    select CAST(FORMAT(latitude, 100) AS DECIMAL(8,6)) latitude from mytable
    

    因为 8 是总位数,6 是精度。

    【讨论】:

    • 我得到以下错误与上述更改 > raise errorclass(errno, errval) E pymysql.err.ProgrammingError: (1064, "您的 SQL 语法有错误;请查看与您的对应的手册MariaDB 服务器版本,用于在第 1 行的 '(8, 6)) 纬度附近使用 schemaName.tableName')。
    • 我的错,把(8, 6),后面的空格去掉,转换成(8,6)
    • FLOAT 更改为DECIMAL,它应该可以工作了。
    猜你喜欢
    • 2022-09-28
    • 2015-08-03
    • 1970-01-01
    • 1970-01-01
    • 2013-12-06
    • 1970-01-01
    • 1970-01-01
    • 2014-05-15
    • 1970-01-01
    相关资源
    最近更新 更多