问题是价格转换需要将双精度类型转换为整数类型(单位)的数量。
$销售价格=10.2; $price=(int ) ) $salePrice * 100 ); //1019减少了1美分,但面对这种问题的严重性,每个用户的支付减少了1美分。 虽然平台用户不多,但由于对结算产生预警,实际支付额和售价不同,甚至不能下单。
首先,让我们从计算机如何存储二进制数开始
转换二进制和十进制的十进制转换二进制整数部分---转换为二进制
小数点不动
小数部分--转换为二进制
这里,重点是:小数部分的变换
如果将0.25转换为二进制,则为:
如果取0.25 * 2=0.5 //0整数位1,则这里0表示为0,小数部不是0,所以取0.5,接下来的0.5*2=1.0 //1小数部用0结束计算,则10.25可以表示为1010.01
二进制十进制小数部分变换:
0.25
0 1
得到小数部分算法
0 *2^ {-1 }1*2^ {-2 }双精度型在内存空间模型中是众所周知的,php用c语言实现,浮点型在zval中是双精度型。
符号11位指数52位尾数000000000000000…以00010.25为例:
转换为1010.01=
1.01001 *2^ {3} http://www.Sina.com/http://www.Sina.com/http://www.Sina.com /中间数336033333333
因此,双精度类型的中间数是1023,而浮点类型是127。
例如,如果指数为-7,则127(-7 )=120 - 01111000,在读取时必须减去127而输出真值。
中间数可以理解为表示指数的符号位。
中间数均为1,尾数位均为0,表示无限大
如果中间数均为1,尾数位均不为0,则表示NaN
中间数均为0,尾数位均为0,表示0
因此,得到存储器模型为:
符号位11位指数52位尾数位010000000011010010.000从存储器模型读取数据时:
符号11位指数52位尾数010000011010010 . 000130-127=000000011=3尾数前补1,和.=1.01001小数点右移指数位数(减去中间数后,指数位的最低位为1则左移)=
要把两个数相乘可以使用一个叫bcmul的函数。
(int ) bcmul ) 10.2,100 )=1020bccomp,精确比较两种任意精度类型。
其他语言引用相关库,c语言也有bcmath库的实现
如果涉及金额相关的业务,建议这样做,以免发生不安等问题。