什么是最大值我应该为浮点数显示的小数位数? (PHP)

我仍然无法得到准确的结果。什么是最大值如果我希望它尽可能准确,我应该显示的小数位数? 一些代码(准备复制粘贴和测试):
// Test with 5 decimals 
$a = 0.00001;
echo bcadd($a,$a,5) . '<br/>';
echo bcadd($a,$a,6) . '<br/>';
echo number_format(bcadd($a,$a,5),5) . '<br/>';
echo number_format(bcadd($a,$a,5),6) . '<br/>';
echo bcadd(0.00001,0.00001,20) . '<br/>';
echo number_format(bcadd($a,$a,20),5) . '<br/>';
echo number_format(bcadd($a,$a,20),21) . '<br/><br/>';

/* Output:
0.00000
0.000000
0.00000
0.000000
0.00000000000000000000
0.00000
0.000000000000000000000
*/

// Test with 4 decimals
$a = 0.0001;
echo bcadd($a,$a,5) . '<br/>';
echo bcadd($a,$a,6) . '<br/>';
echo number_format(bcadd($a,$a,5),5) . '<br/>';
echo number_format(bcadd($a,$a,5),6) . '<br/>';
echo bcadd(0.00001,0.00001,20) . '<br/>'; // wtf? this outputs 0 too?
echo number_format(bcadd($a,$a,20),5) . '<br/>';
echo number_format(bcadd($a,$a,20),21) . '<br/>';

/* Output:
0.00020
0.000200
0.00020
0.000200
0.00000000000000000000
0.00020
0.000200000000000000010
*/
我应该推断答案是4 ???但我仍然有一个问题在于评论 编辑:我认为没有人理解我的测试。我知道花车不准确。但有一点是1!= 0.98990123,其他的东西是1!= 0.0000。如果我将b设置为bc *函数中的精度,我希望得到至少0.9899(如果完美答案是1),而不是0.0000。有一件事是“对于无限精度来说并不完全准确”,另一件事是“完全没用”。 编辑2:@Michael Borgwardt有解决方案     
已邀请:
您的问题的主要原因是您使用浮点文字。当编译或解释代码并将其转换为二进制分数时,这会导致舍入错误。 那时,你已经输了 - 使用bc数学函数也无济于事。要正确使用它们,您必须使用字符串文字:
echo bcadd('0.00001','0.00001',20);
将打印:
0.00002000000000000000
    
  什么是最大值如果我希望它尽可能准确,我应该显示的小数位数? 您的问题始于尝试从浮点计算中获取准确的值。由于表示错误,通常无法从浮点计算中获得准确的值。值0.0001无法在二进制浮点中精确表示,因此实际存储的值将与0.0001略有不同,这已经给您一个不准确的信息。您应该期望最低有效数字不准确。显示更多小数不会使您的计算更准确 - 它只会使固有的不准确性更加明显。 如果你需要准确性,你应该使用不同的数据类型(bcadd接受字符串,但从float到字符串的转换仍然会引入不准确)或更改程序以允许答案与精确答案略有不同。 如果您只想显示有用的答案,可以将其显示为对您的应用程序有意义的精度。如果您正在计算温度以设置烤箱烹饪火鸡,那么将答案舍入到几个重要数字应该没问题。如果您正在进行科学计算,您可能希望显示具有3,4或更多有效数字的答案。如果您需要100%的准确度,那么您需要重新考虑您的设计。     
“bcadd”需要三个参数。前两个是表示左右操作数的字符串,一个是表示结果中小数位的整数。此函数输出一个字符串。尝试在第五个结果回显中使用字符串值而不是整数。 另外,关于浮点数的精度(来自PHP.net): 浮点的大小取决于平台,尽管最大值为〜1.8e308,精度约为14位十进制数是一个常见值(64位IEEE格式)。     
尝试使用BCMath库。它基本上将数字存储为字符串,但允许您对其进行算术运算。 处理非常大或非常小的数字     

要回复问题请先登录注册