在 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 时,如何避免从数据库中过度获取(即仅获取查询中指定的字段)?
如何在Avro Union逻辑类型字段中指定转换器的默认值?
使用sql查询mysql/oracle/sql server/gp数据库中指定表的字段信息(字段名/字段类型/字段长度/是否是主键/是否为空)