2017-08-23 289 views
0

我在数据库中保留一个有十进制类型的字段。如何在PHP中输入decimal?

我该如何输入?

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

它是不工作的,因为回报:

致命错误:未捕获的类型错误:用getPrice的返回值()必须是十进制的一个实例,花车返回。

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

我可以使用浮动的打字,但这是安全和良好的?重点在于浮球式可能存在数字错误(Float or decimal for prices?)。

+1

所以改变看看。这将比提问更快。 –

+1

只需将其声明为浮点返回值?函数getPrice():float {' – Qirel

+0

在返回语句之前尝试四舍五入($ temp)。 http://php.net/manual/en/function.round.php –

回答

0

别担心... Float是好的,是安全的。

如果您的价格长于小数点后十位,您没事。

但是:

永远不要相信浮点数结果精确到了最后一位,也不要直接用于相等比较浮点数。

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

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

+3

花车不是很好的钱 –

+0

@EdHeal如果钱只有两个DP,它应该是...... – Adi219

+0

这也是小数点另一端的小数位数。 –

0

我会推荐在读取和写入DECIMAL值时使用字符串,以尽量减少在PHP中使用它们进行“简单”算术的诱惑力。只要你将它们投入浮标并进行计算,就有可能失去精度。将这些计算留在数据库本身中,并使用字符串进行输入/输出。

0

不要听取推荐使用浮动金钱价值。这非常危险,因为浮点数不能保证非整数值的准确比较。

好的解决方案是使用整数乘法器。 最好的解决方案是创建代表类型钱的ValueObject。