Skip to content

Latest commit

 

History

History
48 lines (32 loc) · 1.12 KB

ykw_php_working_with_money.md

File metadata and controls

48 lines (32 loc) · 1.12 KB

Working with Money

浮点数不精确

10 进制小数计算机内部无法用二进制的小数来精确的表达.

计算总是使用最小单位,int 类型

复合运算时的误差传递可能导致不可思议的“误差”:

$a = 0.1;
$b = 0.7;
$c = intval(($a + $b) * 10);
echo $c;

//output: 7

简单的 *100 也会出现误差

(19.6*100) != 1960

gettype(19.6*100) returns 'double', 但是 (19.6*100) !== (double)1960

19.6*100 没有手动就无法与任何类型进行比较,应该首先将其转化为其他类型: (string)(19.6*100) == 1960

$a = '17.9';
$b = intval($a*100);
echo $b;

// output: 1789

可以用 round()(string) 解决,最好还是使用 BCMath 的方法

数据库必须存成最小单位

数据库存成浮点数,PHP 取出来会转换成浮点数,会影响之后的计算。 另外数据库的聚合函数也会不按预期工作:

// distance FLOAT 类型,5条记录的值分别为:40.2, 40, 40, 40
select sum(distance) from entry_results;
// 200.0200004577637