Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/294.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
货币的浮点精度:使用;“圆形”;MySQL查询与PHP与Javascript中的函数_Php_Mysql_Floating Point_Precision - Fatal编程技术网

货币的浮点精度:使用;“圆形”;MySQL查询与PHP与Javascript中的函数

货币的浮点精度:使用;“圆形”;MySQL查询与PHP与Javascript中的函数,php,mysql,floating-point,precision,Php,Mysql,Floating Point,Precision,我正在处理美元金额的问题。在MySQL数据库中,以下字段费用和费率(百分比)为十进制类型,精度为2 SELECT ROUND(fee * (1- rate/100))),2 ) as profit from products 既然查询只是返回值,而不是将它们保存在变量中,那么精度问题*是否仍然存在(PHP或JS附带的)?如果是这样的话,最好在PHP或JS中对浮点数进行四舍五入 *是的,我的意思是在保存double时会出现精度问题,例如,1.5可能会保存为1.499999,其他人可能已经提到了这

我正在处理美元金额的问题。在MySQL数据库中,以下字段费用和费率(百分比)为十进制类型,精度为2

SELECT ROUND(fee * (1- rate/100))),2 ) as profit
from products
既然查询只是返回值,而不是将它们保存在变量中,那么精度问题*是否仍然存在(PHP或JS附带的)?如果是这样的话,最好在PHP或JS中对浮点数进行四舍五入


*是的,我的意思是在保存double时会出现精度问题,例如,1.5可能会保存为1.499999,其他人可能已经提到了这一点,但我想让您知道我用PHP处理货币计算的系统

我使用整数。问题是,我让每个增量代表我需要的最高精度。对于我的大多数申请,这是百分之一美元,或一美分。然而,你可以拥有百万分之一或者你需要的任何东西

所以在实践中,精度是百分之一,$.01表示为1,$.10表示为10,$1.00表示为100,依此类推。这实际上消除了取整问题,因为您将只处理整数,因为任何计算的小数部分都将被截断。不过,这是可以的,因为整数表示所需的最佳精度


诚然,这需要更多的开发来处理,但舍入不应该是突然出现的问题之一。

精度问题是否仍然存在?啊哈什么?您的计算将返回跨越两个以上小数点的结果。你用两个。因此,将出现舍入,是-问题仍然存在。在我看来(这不是事实),最好让数据管理软件——数据库——处理数字。但这确实很难实现,因为您必须在PHP中执行计算,所以处理起来相当棘手。问题的核心是,您使用的算法必须是一致的。你可以在N位小数后取整、向下取整或截断——你必须始终这样做。简短回答:不要用浮点值来表示货币。尽可能将货币值存储为整数。@辛巴,那么更改值的存储如何解决不一致的舍入问题呢?@birdspider因此,如果客户想计算386.74的3%利息,并将这一半舍入为偶数,我会怎么做?重塑数学?如果我真的重新发明它,我会遇到与以前完全相同的问题,刚才我还有一个半生不熟的、缓慢的、充满错误的数学库。这看起来很好,直到你需要划分一些东西。比如说$10/3,即使以整数开头,也会在PHP1000/3Hi中给你一个浮点数。谢谢你的回复。它仍然有效,即使有分裂。不管你用什么方法,你几乎总是会得到剩下的一分钱。即使使用小数点,当10.00美元除以3时,你仍然会得到3.33333333美元。按照我概述的方法,最终得到333.3333。无论哪种方式,你都必须决定如何处理一分钱的多余部分。银行通常会在你欠他们的时候把钱凑齐,如果他们欠你的话就把钱凑齐。Stripe也会这样做(所以这实际上必须是一种非常合法的方法):