安装"eduTrac SIS"并访问"仪表板"后出现此错误
Ubuntu 16.4,PHP 7.0(php7.0-fpm),Apache2,Nginx,
URL显示错误500并显示nginx/error.log,
FastCGI发送到stderr:"PHP消息:PHP致命错误:未捕获错误:在/ var/www/html/eduTrac-SIS/app/src/vendor/phpbenchmark/phpbenchmark/lib/PHPBenchmark中调用未定义函数PHPBenchmark\bcadd() /Utils.php:18
我的数据库中有大约 10-15 个数字,精度为 1、2 或 3 位小数,有符号和无符号。
正在使用的数据类型示例:
decimal(10,3), decimal(10,2), decimal(10,1)
Run Code Online (Sandbox Code Playgroud)
我在 PHP 中计算它们是这样的:
$result = ($value1from_col1 + ($value2from_col2 * 30)/500) * 0.453;
Run Code Online (Sandbox Code Playgroud)
然后我使用一些这样的round()功能:
$result_round = round($result, 2, PHP_ROUND_HALF_UP);
Run Code Online (Sandbox Code Playgroud)
结果$result_round最大:100.000,999
我正在检查:多少精度的 bcmath PHP 库? 并且答案指出,如果您不使用 round()、printf 等函数,这不会成为问题。
那么我应该使用 BCMath-extension 吗?(只是因为我正在使用round())
我正在使用PHP进行计算bcmath,需要e通过小数指数来提高.不幸的是,bcpow()只接受整数指数.指数通常比浮点数允许的精度更高,因此正常的算术函数不会削减它.
例如:
$e = exp(1);
$pow = "0.000000000000000000108420217248550443400745280086994171142578125";
$result = bcpow($e, $pow);
Run Code Online (Sandbox Code Playgroud)
结果是"1"错误,"bc数学警告:指数中的非零刻度".
我可以用另一种功能代替bcpow()吗?
我正在用 PHP 和 MySQL 构建一种会计系统。我的数据库包含DECIMAL (11,2)货币列,以及DECIMAL货币操作中使用的所有其他值(例如要应用的百分比)。我以前从未编写过类似的程序,所以我不确定我做的是正确的事情。
我在数据库中使用的精度级别是否正确?
在 PHP 方面:
我是否应该对以后可能存储在数据库中的任何值使用 BC Math 函数?
我还必须使用,小数点和.千位分隔符来格式化货币值。我知道number_format,最近发现money_format,但手册说两者都使用浮子进行操作。
我可以使用number_format或money_format作为将要显示的值,或导出到 CSV 或 Excel 的值吗?
我们正在寻找PHP中的第N个根.我们需要使用非常大的数字来执行此操作,并且Windows计算器返回2.使用以下代码我们得到1.是否有人知道这是如何工作的?
echo bcpow(18446744073709551616, 1/64);
Run Code Online (Sandbox Code Playgroud) 我正在使用PHP的bcmath库来执行定点数的操作.我期望获得Python Decimal类的相同行为,但我很惊讶地发现以下行为:
// PHP:
$a = bcdiv('15.80', '483.49870000', 26);
$b = bcmul($a, '483.49870000', 26);
echo $b; // prints 15.79999999999999999999991853
Run Code Online (Sandbox Code Playgroud)
Decimal在Python中使用s我得到:
# Python:
from decimal import Decimal
a = Decimal('15.80') / Decimal('483.49870000')
b = a * Decimal('483.49870000')
print(b) # prints 15.80000000000000000000000000
Run Code Online (Sandbox Code Playgroud)
这是为什么?当我使用它来执行非常敏感的操作时,我想找到一种方法来在PHP中获得与Python相同的结果(即(x / y) * y == x)
我似乎无法在php.net文档中找到解释以下结果的任何内容:
$ php -r 'var_dump(bcsub("0.3", "0.2", 4));'
string(6) "0.1000"
$ php -r 'var_dump(bcmul("0.3", "0.2", 4));'
string(4) "0.06"
Run Code Online (Sandbox Code Playgroud)
减法结果正是我所期望的那样(我指定了一个4位数的刻度,它在结果中给了我一个).乘法结果不是(我指定了一个4位数的刻度,但它在结果中给了我一个2位数的刻度).为什么不同?
注意: 我已经知道如何使用number_format(),我也在0.06 === 0.0600数学上知道.我只对理解为什么BC Math似乎在结果的规模上采取不同的行为感兴趣.
注意#2: 如上所述,number_format()不是这个问题的答案,所引用的"重复问题"中使用的答案都建议使用number_format().我完全知道这个函数可以用来将数字格式化为指定的精度.我只是想知道为什么这些函数的返回值有不同的比例,而不是如何修复它们.
如果我想将多个值与 BCMath 一起添加,我可以这样做:
$total_cost1 = bcadd($value1, $value2);
$total_cost2 = bcadd($value3, $value4);
$total_cost3 = bcadd($value5, $value6);
$total_cost4 = bcadd($value7, $value8);
$total_cost =
bcadd(bcadd($total1_cost, $total2_cost),
bcadd($total3_cost, $total4_cost));
Run Code Online (Sandbox Code Playgroud)
但它使它变得如此不可读,并且很容易出错。请告诉我还有另一种方法可以解决这个问题......!?
我正在尝试使用 php 和 bc-math 扩展将 wei 转换为 eth。
尝试使用此函数转换它时:
function wei2eth($wei)
{
return bcdiv($wei,1000000000000000000,18);
}
Run Code Online (Sandbox Code Playgroud)
我收到以下错误:
警告:bcdiv():在 C:\xampp\htdocs\test\coindata.php 第 121 行被零除
有没有人使用 bc-math 扩展和 bcdiv 将 wei 转换为 eth 并知道,为什么我会收到此错误?
提前致谢
我研究一些小数,如 0.0000687、0.0000063241、0.0000454。我使用 BCMath 来获得最精确的结果,因为它涉及金钱计算,到目前为止,BCMath 对我修复之前遇到的错误非常有帮助。但我发现如果将 PHP 自动转换的指数值传递给 BCMath,BCMath 就无法正常工作。下面是示例代码:
$x = 0.00002123; // let say I got this value from the other computation;
// this $x value will automatically turn to exponential
// value by php because it have few of leading 0 after the '.'
Run Code Online (Sandbox Code Playgroud)
PHP 开始将实数转换为指数数的模式是:(见下图)
从上图可以看出,PHP 开始将实数转换为指数数的模式是当前导 0 的数字达到 4 次 -> 0.0000xxxxx(PHP 开始转换为指数的模式)。
然后,假设这个变量 $x 将被计算到 PHP BCMath 函数之一中:
# First, I work with float number
$calculation1 = bcadd($x,5,12); // adding variable $x to 5
$calculation2 …Run Code Online (Sandbox Code Playgroud)