我在数据库中保留了一个十进制类型的字段。
我怎样才能输入这个?
public function getPrice() : decimal
{
$temp = 123.45;
return $temp;
}
Run Code Online (Sandbox Code Playgroud)
它不起作用,因为返回:
致命错误:未捕获的类型错误:getPrice() 的返回值必须是小数的实例,返回浮点数。
无论如何类型十进制不存在。
我可以使用 float 进行打字,但这样安全吗?关键是浮点类型可能存在数字错误(价格是浮点数还是小数点?)。
不要听从建议使用浮动货币价值。这真的很危险,因为浮点数不能保证非整数值的准确比较。
好的解决方案是使用带有乘数的整数。最好的解决方案是创建代表货币类型的 ValueObject。
Adi*_*219 -18
别担心……Float很好而且很安全。
如果您的价格小于小数点后十位,那就没问题。
然而:
切勿相信浮点数结果精确到最后一位,也不要直接比较浮点数是否相等。
浮点数的精度有限。虽然这取决于系统,但 PHP 通常使用 IEEE 754 双精度格式,由于按 1.11e-16 的顺序舍入,这将给出最大相对误差。非初等算术运算可能会产生较大的误差,当然,当多个运算复合时,必须考虑误差传播。
此外,可以精确表示为以 10 为基数的浮点数的有理数(例如 0.1 或 0.7),没有精确表示为以 2 为基数的浮点数(无论尾数的大小如何,在内部使用)。因此,它们无法在不损失少量精度的情况下转换为内部二进制对应项。这可能会导致令人困惑的结果:例如,floor((0.1+0.7)*10) 通常会返回 7 而不是预期的 8,因为内部表示类似于 7.9999999999999991118...