如何在PHP中键入十进制?

时间:2017-08-23 19:23:14

标签: php php-7

我在数据库中保留一个具有十进制类型的字段。

我该如何输入?

public function getPrice() : decimal
{
    $temp = 123.45;
    return $temp;
}

它不起作用,因为返回:

致命错误:未捕获TypeError:getPrice()的返回值必须是decimal的实例,float返回。

无论如何都不存在类型十进制。

我可以使用浮动进行拍打,但这样安全吗?关键是浮点类型可能存在数值错误(Float or decimal for prices?)。

3 个答案:

答案 0 :(得分:2)

不要担心...... Float很好并且很安全。

如果您的价格长度小于十位小名,那么您很好。

<强> 然而:

永远不要将浮点数结果信任到最后一位,并且不要直接比较浮点数是否相等。

浮点数的精度有限。虽然它取决于系统,但PHP通常使用IEEE 754双精度格式,由于舍入的顺序为1.11e-16,因此会产生最大的相对误差。非基本算术运算可能会产生更大的误差,当然,当复合多个运算时,必须考虑误差传播。

此外,基本10中的浮点数精确表示的有理数,如0.1或0.7,没有精确表示为基数2中的浮点数,无论尾数的大小如何,它都在内部使用。因此,它们不能在没有很小精度损失的情况下转换为它们的内部二进制对应物。这可能会导致令人困惑的结果:例如,floor((0.1 + 0.7)* 10)通常会返回7而不是预期的8,因为内部表示将类似于7.9999999999999991118 ....

答案 1 :(得分:0)

我建议您在阅读时和写入DECIMAL值时都使用字符串,以尽量减少做的诱惑&#34;简单&#34; PHP中的算术使用它们。只要将它们转换为浮点并进行计算,就有可能失去精度。将这些计算保留在DB本身中,并使用字符串进行输入/输出。

答案 2 :(得分:0)

不要听建议使用花车作为货币价值。这非常危险,因为浮动数字不能保证非整数值的准确比较。

好的解决方案是使用带乘数的整数。 最好的解决方案是创建表示类型货币的ValueObject。