ChatGPT解决这个技术问题 Extra ChatGPT

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

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

目前,它看起来像这样:

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

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

Doctrine2 documentation 说:

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

但这并不能告诉我很多。

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

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

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

L
Louis-Philippe Huberdeau

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

取自 MySQL documentation

在 DECIMAL 列声明中,可以(并且通常是)指定精度和小数位数;例如:salary DECIMAL(5,2) 在本例中,5 是精度,2 是比例。精度表示为值存储的有效位数,小数位数表示可以存储在小数点后的位数。标准 SQL 要求 DECIMAL(5,2) 能够存储具有五位和两位小数的任何值,因此可以存储在薪水列中的值范围为 -999.99 到 999.99。


k
khagler

只是一个简短的说明:我必须从属性精度和比例中删除引号,如下所示:

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

s
slfan
@Column(type="decimal", precision=5, scale=2) means 123.45

W
Waldemar

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

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

PS 至少目前没有人在他们的账户上拥有 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
唯一的问题可能是处理舍入错误时,但小数也有同样的问题。
我也很好奇,如果大银行有像美国这样的数万亿客户,他们会怎么做?
F
Fahim
 * @ORM\Column(type="decimal", precision=10, scale=2)