gpt4 book ai didi

即使使用 DECIMAL,MySQL 也无法处理大值

转载 作者:太空宇宙 更新时间:2023-11-03 11:15:19 24 4
gpt4 key购买 nike

DECIMAL 应该是精确的。它不是。它像疯了一样圆!

表格:
account_balance DECIMAL(18,4)

如果我插入 43210987654321.9999它四舍五入为 43210987654322.0000

如果我插入 43210987654321.9876它四舍五入为 43210987654321.9840

为什么?如果我在创建表时使用大于 18 的数字,那就更糟了。

编辑:
我发布此澄清编辑是因为有些人不知道 DECIMAL 数据类型。

DECIMAL 数据类型是 FIXED POINT 数据类型,而不是 FLOATING POINT 数据类型。

使用它的原因是:
(1) 以精确的精度存储具有小数值的大量数字。
(2)防止使用 float 计算时无法避免的舍入错误。因此,对 DECIMAL 值的任何计算都应该是准确的……没有舍入误差。

POSTRESQL
http://www.postgresql.org/docs/8.1/static/datatype.html

numeric -- 用户指定的精度 -- 精确 --无限制

类型 numeric 可以存储精度高达 1000 位的数字并准确执行计算。 特别推荐用于存储货币金额和其他需要准确性的数量。但是,与整数类型或下一节中描述的浮点类型相比,数值运算非常慢。

decimal 和 numeric 类型是等价的。 这两种类型都是 SQL 标准的一部分。


MySQL

DECIMAL( , ) 存储为字符串的 DOUBLE,允许固定小数点。
http://www.htmlite.com/mysql003.php

MySQL 文档
定点(精确值)类型

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

从 MySQL 5.0.3 开始,DECIMAL 值以二进制格式存储。以前,它们存储为字符串,值的每一位使用一个字符。 http://dev.mysql.com/doc/refman/5.0/en/numeric-types.html

M 的最大值 65 意味着对 DECIMAL 值的计算精确到 65 位。​​此 65 位精度限制也适用于精确值数字文字,因此最大范围这些字面量与以前不同。 (在旧版本的 MySQL 中,十进制值最多可以有 254 位。但是,计算使用 float 完成的,因此是近似值不准确。)

计算涉及精确十进制数的精确到 65 位。这小于 MySQL 5.0.3 之前允许的最大位数(254 位),但精确值精度更高。以前的计算都是用 double float 完成的,精度为52位(约15位小数)。

http://dev.mysql.com/doc/refman/5.1/en/precision-math-decimal-changes.html

最佳答案

我在我本地的 mysql 5.1.36 上测试过,它没有舍入。你用的是什么版本。

另外,你用什么插入。你确定是mysql舍入而不是插入到mysql之前的存储。

关于即使使用 DECIMAL,MySQL 也无法处理大值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5480804/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com