在 Doctrine 2 中指定十进制字段类型时,比例和精度是啥意思?

Posted

技术标签:

【中文标题】在 Doctrine 2 中指定十进制字段类型时,比例和精度是啥意思?【英文标题】:What do scale and precision mean when specifying a decimal field type in Doctrine 2?在 Doctrine 2 中指定十进制字段类型时,比例和精度是什么意思? 【发布时间】:2013-02-03 03:15:35 【问题描述】:

我正在为我的 Symfony2 应用程序创建一个十进制字段来保存 Doctrine2 中的财务数据。

目前,它看起来像这样:

/**
 * @ORM\Column(type="decimal")
 */
protected $rate;

当我输入一个值并将该值保存到数据库时,它被四舍五入为整数。我猜我需要为该字段设置精度和比例类型,但我需要有人来解释他们的确切作用?

Doctrine2 documentation 说:

precision:小数(精确数字)列的精度(仅适用于小数列)

scale:小数(精确数字)列的比例(仅适用于小数列)

但这并不能告诉我很多。

我猜精度是要四舍五入的小数位数,所以我假设应该是 2,但什么是比例?比例是有效数字吗?

我的字段声明应该是这样吗? :-

/**
 * @ORM\Column(type="decimal", precision=2, scale=4)
 */
protected $rate;

【问题讨论】:

【参考方案1】:

Doctrine 使用类似于 SQL 类型的类型。小数恰好是固定精度类型(与浮点数不同)。

取自mysql documentation:

在 DECIMAL 列声明中,可以(并且通常是)指定精度和小数位数;例如:

工资 DECIMAL(5,2)

在本例中,5 是精度,2 是比例。精度表示为值存储的有效位数,小数位数表示小数点后可存储的位数。

标准 SQL 要求 DECIMAL(5,2) 能够存储具有五位和两位小数的任何值,因此可以存储在薪水列中的值范围为 -999.99 到 999.99。

【讨论】:

【参考方案2】:

快速说明:我必须从属性精度和比例中删除引号,如下所示:

@ORM\Column(type="decimal", precision=8, scale=2)

【讨论】:

【参考方案3】:
@Column(type="decimal", precision=5, scale=2) means 123.45

【讨论】:

【参考方案4】:

我知道这是旧的,但是为什么程序员仍然使用十进制...只需使用 64 位整数并将值定义为美分(或千位)而不是整数。一切都由此简化。

即而不是存储 123.45,只存储 12345,对整数进行所有计算,并在需要时将值作为 123.45 呈现给用户

附:至少目前没有人在他们的账户上拥有 2305843009213693952 美分或 23.058.430.092.136.939,52 个整数。

【讨论】:

有时人们需要处理金钱的百分比和比例,例如根据利润每月提供 25% 的福利或其他东西。然后呢? 您可以随时将该值乘以 100 ( ( 100*a )/b = % ) 并直接获得 %。现在我承认,如果你想拥有 25.1234%,你很快就会用完 trilloners 的数字。 :) 再一次,如果您使用其他人定义的十进制值(例如精度 = 10,比例 = 2),您将只能表示 9.999.999.999,99,即 9+十亿,低于简单的 64 位整数美分给你。 如果您需要给某人 x% 的东西,您只需像手动一样计算它 -> x% = x/100 -> ( x*value )/100 唯一的问题可能是在处理舍入错误时,但小数也有同样的问题。 我也很好奇,如果大银行有像美国这样的数万亿客户,他们会怎么做?【参考方案5】:
 * @ORM\Column(type="decimal", precision=10, scale=2)

【讨论】:

以上是关于在 Doctrine 2 中指定十进制字段类型时,比例和精度是啥意思?的主要内容,如果未能解决你的问题,请参考以下文章

在构建 Java GraphQL API 时,如何避免从数据库中过度获取(即仅获取查询中指定的字段)?

在 package.json 中指定多个类型定义文件

如何在Avro Union逻辑类型字段中指定转换器的默认值?

使用sql查询mysql/oracle/sql server/gp数据库中指定表的字段信息(字段名/字段类型/字段长度/是否是主键/是否为空)

编译时出错 - 在初始化程序中指定的未知字段

flink sql 中指定时间字段