首页 > 编程知识 正文

从double转换到int可能会有损失,double可以自动转换为int吗

时间:2023-05-04 02:28:49 阅读:50712 作者:4789

问题是价格转换需要将双精度类型转换为整数类型(单位)的数量。

$销售价格=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库的实现

如果涉及金额相关的业务,建议这样做,以免发生不安等问题。

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。