Php 使用intval将美元兑换成美分

Php 使用intval将美元兑换成美分,php,Php,我正试图把我的美元兑换成美分,但每次都差一美分。不使用任何php扩展的最好方法是什么 $amount = 129.95; $amountInCents = intval(floatval($amount) * 100); echo $amountInCents; //output: 12994 由于浮点运算和值存储()的不精确性,浮点不能准确地表示许多值,例如129.95-在本例中,它类似于129.949999,因为它不能准确地存储192.95 因此,当您使用intval对其进行取整时,它

我正试图把我的美元兑换成美分,但每次都差一美分。不使用任何php扩展的最好方法是什么

$amount = 129.95;

$amountInCents = intval(floatval($amount) * 100);

echo $amountInCents; //output: 12994

由于浮点运算和值存储()的不精确性,浮点不能准确地表示许多值,例如129.95-在本例中,它类似于129.949999,因为它不能准确地存储192.95

因此,当您使用intval对其进行取整时,它会看到您有12994.999。。。四舍五入到12994

要解决这个问题,你可以试试

1) 如果将美元和美分作为字符串(如
“$129.95”
)获取,请使用字符串解析将美元和美分作为整数计算出来

2) 在将浮点值转换为int之前,将一个非常小的值(如0.00001)添加到浮点值中,这样,如果浮点值仅略低于整数值,则现在仅略高于整数值,并正确舍入


3) 在使用intval之前使用
舍入
,以便将其舍入到最接近的整数。

由于浮点运算和值存储()的不精确性,浮点不能准确地表示许多值,例如129.95-在本例中,它类似于129.949999,因为它不能准确地存储192.95

因此,当您使用intval对其进行取整时,它会看到您有12994.999。。。四舍五入到12994

要解决这个问题,你可以试试

1) 如果将美元和美分作为字符串(如
“$129.95”
)获取,请使用字符串解析将美元和美分作为整数计算出来

2) 在将浮点值转换为int之前,将一个非常小的值(如0.00001)添加到浮点值中,这样,如果浮点值仅略低于整数值,则现在仅略高于整数值,并正确舍入


3) 在使用intval之前使用
舍入
,以便将其舍入到最接近的整数。

并非所有数字都可以用浮点表示。这是显而易见的,因为(例如)只有264个可能的64位值(由于编码调用了NaN和无穷大之类的值,所以实际值较少),但浮点数是无限的

有关详细说明,请参阅

所以像
129.95
这样的数字实际上可能类似于
129.949999923234
,当你计算
intval(val*100)
,你最终得到
12994

一种解决方案是将数字四舍五入而不是截断,大多数语言都会提供多种方法来实现这一点。或者,您可以通过以下方式进行模拟:

intval(val * 100 + 0.5);
或者,您可以通过不使用IEEE754浮动来避免这些问题。现在的整数类型可能已经足够大了,您可以直接存储整数美分,这样就不会发生此类错误(根据计算的复杂性,可能会有其他错误,但几乎可以肯定,它们会比浮点中涉及的错误少)


而且,如果您需要更大的范围,您可能必须选择BigInteger类型的包。

并非所有数字都可以用浮点表示。这是显而易见的,因为(例如)只有264个可能的64位值(由于编码调用了NaN和无穷大之类的值,所以实际值较少),但浮点数是无限的

$amount = 129.95;
echo (string)(floatval($amount) * 100); // cast it to string
有关详细说明,请参阅

所以像
129.95
这样的数字实际上可能类似于
129.949999923234
,当你计算
intval(val*100)
,你最终得到
12994

一种解决方案是将数字四舍五入而不是截断,大多数语言都会提供多种方法来实现这一点。或者,您可以通过以下方式进行模拟:

intval(val * 100 + 0.5);
或者,您可以通过不使用IEEE754浮动来避免这些问题。现在的整数类型可能已经足够大了,您可以直接存储整数美分,这样就不会发生此类错误(根据计算的复杂性,可能会有其他错误,但几乎可以肯定,它们会比浮点中涉及的错误少)



而且,如果您需要更大的范围,您可能必须选择BigInteger类型的软件包。

如果值必须准确,请不要使用浮点数据类型来存储货币值。有关更多信息,请参阅。要更正此问题,只需删除intval和floatval,并让PHP自行强制这些类型。。。。计算机连基本的数学都做不好,这个世界没有希望;)<代码>str_替换('.',',(字符串)$amount)反正没人喜欢你,数学:-PDo不使用浮点数据类型来存储货币值,前提是该值必须准确。有关更多信息,请参阅。要更正此问题,只需删除intval和floatval,并让PHP自行强制这些类型。。。。计算机连基本的数学都做不好,这个世界没有希望;)<代码>str_替换('.',',(字符串)$amount)反正没人喜欢你,数学:-Pbut floatval($amount)返回12995@RomanNewaza我不知道floatval如何返回整数,但floatval($amount)返回12995@RomanNewaza我不明白floatval如何返回整数。然后我可以将它转换为int吗?你甚至不需要进行转换,echo将为您执行此操作,您将得到相同的结果,因为echo将类型强制为字符串。只要你不做任何高精度的数学运算,php就会给你合理的结果。是的,但你不需要-php会自动为你转换它吗?如果他不转换它,然后使用这个变量,他可能会再次得到12994:
echo(int)(floatval($amount)*100)
这里的问题根源在于,分配时的数字从来都不是真正的129.95。第一条语句是精度丢失的地方,因为解析器无法以二进制形式准确地生成该数字。然后我可以将其转换为int吗?您甚至不需要执行强制转换,echo将为您执行此操作
$amount = 129.95;
echo (string)(floatval($amount) * 100); // cast it to string