在MySQL和PHP中使用currency

在MySQL和PHP中使用currency,php,mysql,currency,Php,Mysql,Currency,我在MySQL表中有一个货币列,定义为DECIMAL(19,4)。它不是浮点数,因此不存在精度损失问题 我的问题是如何将它提取到PHP中,对其进行操作,并将其存储回MySQL,而不会丢失精度。默认情况下,如果我获取并操作它,我相信它会变成一个浮点 我的假设是,我可以使用以下方法: $price = $price * 100; $price = (int) $price; //do some manipulation here $price = $price / 100; //store back

我在MySQL表中有一个货币列,定义为DECIMAL(19,4)。它不是浮点数,因此不存在精度损失问题

我的问题是如何将它提取到PHP中,对其进行操作,并将其存储回MySQL,而不会丢失精度。默认情况下,如果我获取并操作它,我相信它会变成一个浮点

我的假设是,我可以使用以下方法:

$price = $price * 100;
$price = (int) $price;
//do some manipulation here
$price = $price / 100;
//store back into MySQL database
这行吗


我也考虑过以整数形式存储和使用BCMath,但我想知道上面的方法是否同样有效。

这太长了,无法发表评论

对于“正常”货币和“正常”金额的货币,则可以使用双精度/十进制(19,4)。双精度的精度为15位精度。这是一个类似于123456789012345的值。即使只是一美分的零头,也相当准确地代表了1230亿美元。使用四舍五入在十进制和双精度之间进行转换应该可以

换句话说,如果您使用的是高达一百万货币单位的金额,并且希望精度降低到单位的千分之一,那么双精度应该可以。如果不是这样,您可能需要一个特殊的数学库来处理该算法。(Postgres有一个内置的。)


有些情况下,这样的范围还不够。当土耳其里拉的交易价格超过1000000比1美元时,那么1/1000单位的价格区间将只有不到100万美元——这可能是不够的。或者,如果你重视金融投资组合,特别是使用交易的名义价值,那么范围可能不够。

你可以考虑在数据库内做所有的操作。其中一个问题是我需要执行计算,然后要求用户验证他们是否想继续。如果他们继续,那么我将把它添加到数据库中。你能提供一个更好的例子来说明你正在尝试的实际算法吗?在乘以100之后再除以100应该没有什么问题。这将涉及到在购物车中以一定的价格(从产品表中获取的价格)添加一定数量的物品,并可能计算一些税费。如果用户确认付款,那么它将被添加回发票表中的数据库。关于上面的“使用舍入”,您是否建议我在数据库中使用舍入($product_price,2)而不是乘法并转换为整数?在它返回数据库之前进行四舍五入($inv_total,2)?@kojow7。基本上,是的。除非你的计算涉及到复杂的计算,或者涉及到不同量级的数字组合,否则这应该是可行的。