bcdiv 使用带有科学记数法的非常小的浮点导致“除以零”错误

2024-03-09

使用 bcdiv,我无法使用科学记数法除以小浮点数:

工作代码:

bcscale(30);
$a = '1' ;
$b = '0.00000001';
$result = bcdiv($a, $b);
var_dump($result);

结果是 :

字符串(20)“100000000.0000000000”

非工作代码:

bcscale(30);
$a =  '1' ;
$b =  '1e-8';
$result = bcdiv($a, $b);
var_dump($result);

结果是 :

警告:bcdiv() [function.bcdiv]:除以零 C:\wamp\www\utilitaires\test_bcdiv.php 第 XX 行 NULL

我怎样才能正确地进行这个除法,同时减少精度损失?


那是因为,实际上,bcmath不支持科学计数法。手册中没有提及,但正如您所看到的,执行 http://lxr.php.net/xref/PHP_5_2/ext/bcmath/bcmath.c#351使用参数转换,它被命名为php_str2num http://lxr.php.net/xref/PHP_5_2/ext/bcmath/bcmath.c#php_str2num:

static void php_str2num(bc_num *num, char *str TSRMLS_DC)
{
    char *p;

    if (!(p = strchr(str, '.'))) {
        bc_str2num(num, str, 0 TSRMLS_CC);
        return;
    }

    bc_str2num(num, str, strlen(p+1) TSRMLS_CC);
}

and so bc_str2num http://lxr.php.net/xref/PHP_5_2/ext/bcmath/libbcmath/src/str2num.c#44:

bc_str2num (bc_num *num, char *str, int scale TSRMLS_DC)
{
  int digits, strscale;
  char *ptr, *nptr;
  char zero_int;

  /* Prepare num. */
  bc_free_num (num);

  /* Check for valid number and count digits. */
  ptr = str;
  digits = 0;
  strscale = 0;
  zero_int = FALSE;
  if ( (*ptr == '+') || (*ptr == '-'))  ptr++;  /* Sign */
  while (*ptr == '0') ptr++;            /* Skip leading zeros. */
  while (isdigit((int)*ptr)) ptr++, digits++;   /* digits */
  if (*ptr == '.') ptr++;           /* decimal point */
  while (isdigit((int)*ptr)) ptr++, strscale++; /* digits */
  if ((*ptr != '\0') || (digits+strscale == 0))
    {
      *num = bc_copy_num (BCG(_zero_));
      return;
    }

  /* Adjust numbers and allocate storage and initialize fields. */
  strscale = MIN(strscale, scale);
  if (digits == 0)
    {
      zero_int = TRUE;
      digits = 1;
    }
  *num = bc_new_num (digits, strscale);

  /* Build the whole number. */
  ptr = str;
  if (*ptr == '-')
    {
      (*num)->n_sign = MINUS;
      ptr++;
    }
  else
    {
      (*num)->n_sign = PLUS;
      if (*ptr == '+') ptr++;
    }
  while (*ptr == '0') ptr++;            /* Skip leading zeros. */
  nptr = (*num)->n_value;
  if (zero_int)
    {
      *nptr++ = 0;
      digits = 0;
    }
  for (;digits > 0; digits--)
    *nptr++ = CH_VAL(*ptr++);

  /* Build the fractional part. */
  if (strscale > 0)
    {
      ptr++;  /* skip the decimal point! */
      for (;strscale > 0; strscale--)
    *nptr++ = CH_VAL(*ptr++);
    }
}

-不难看出它在科学记数法上会失败(评论很好)。也许文档需要更新(隐含地提到这一点)。

可能的解决方案是在应用之前将字符串转换为普通视图bcmath功能

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

bcdiv 使用带有科学记数法的非常小的浮点导致“除以零”错误 的相关文章

  • PHP MySql 百分比

    我的问题是关于百分比 我不是专家 所以我会尽力以更好的方式进行解释 我的 mysql 服务器中有一个表 假设有 700 条记录 如下所示 Name country language Birth Lucy UK EN 1980 Mari Ca
  • openssl_pkey_get_details($res) 不返回公共指数

    我在用着这个例子 https stackoverflow com a 12575951 2016196使用 php 生成的密钥进行 javascript 加密openssl图书馆 但是 details openssl pkey get de
  • 简单的 PHP 条件帮助: if($Var1 = in list($List) and $Cond2) - 这可能吗?

    这是一个可能的功能吗 我需要检查一个变量是否存在于我需要检查的变量列表中 并且 cond2 是否为 true 例如 if row name 1 2 3 Cond2 doThis 它对我不起作用 我在复制粘贴中更改的只是我的列表和变量名称 i
  • Laravel 从 5.6 升级到 Laravel 6

    我有一个项目https github com javedbaloch4 Laravel Booking https github com javedbaloch4 Laravel Booking发展于Laravel 5 6现在我想将其升级到
  • 优雅地处理没有数据的 amcharts

    我想知道我的 dataProvider 是否为空 amCharts绘制时默认为null 我怎样才能动态地处理它 var chart AmCharts makeChart chartdiv theme none type serial dat
  • 如何检查PHP变量是否包含非数字?

    我只是想知道检查 PHP 变量中是否有非数字的方法以及它是否也检测字符之间的空格 需要确保我的表单字段中没有添加任何奇怪的内容 提前致谢 如果您的意思是您只想要一个包含数字的值 那么您可以使用ctype digit http php net
  • PHP 会话不适用于游戏

    我正在尝试模仿一款名为 SKUNK 用骰子玩 的游戏来完成一项作业 我无法让会话正常工作 这是我第一次使用 PHP 我还被告知无需会议即可完成 这是我的代码
  • 如何从父类函数访问子类中定义的常量?

    我从 php net 看到这个例子 但 c MY CONST 仅在 5 3
  • 如何使用 php 下载/打印页面的特定部分

    我有一个 HTML 页面如下 Lorem Ipsum is simply dummy text of the printing and typesetting industry Lorem Ipsum has been the indust
  • 将“php”作为 shell 脚本执行时的自定义 php.ini 文件

    我在跑php作为 shell 脚本 我不确定 shell脚本 是否正确 该文件以 usr bin php 这很好用 但 MongoDB 类没有正确加载php ini文件 具有extension mongo so 未使用 我该如何使用它tha
  • 从 smarty 访问 PHP 文件的变量(本地或全局)

    我有一个 php 文件 其中包含一些本地和全局变量 例如 foo 从此文件中调用 smarty 对象 如何在不更改 PHP 文件的情况下从 smarty 脚本访问 foo Thanks 如果你有一个名为 BASE 的常量变量 并且定义如下
  • 使用 preg_replace 仅替换第一个匹配项

    我有一个结构类似于以下的字符串 aba aaa cba sbd dga gad aaa cbz 该字符串每次都可能有点不同 因为它来自外部源 我只想替换第一次出现的 aaa 但其他人则不然 是否可以 可选的第四个参数预替换 http php
  • 如何在原则 2 迁移中删除外键

    我想在原则 2 迁移中删除外键 但没有 dropForeignKeyConstraint 有谁知道怎么丢掉吗 public function down Schema schema table schema gt getTable table
  • 使用 SSL 证书验证 Web 浏览器

    是否可以使用 ssl 证书对 Web 浏览器进行身份验证 假设我在应用程序中存储私钥 有什么方法可以从浏览器读取密钥并尝试基于该私钥进行身份验证 您可以使用 SSL TLS 客户端证书身份验证来对浏览器 用户进行身份验证 服务器必须请求客户
  • PHP 脚本可以在终端中运行,但不能在浏览器中运行

    我正在尝试执行exec命令 但我遇到了问题 当我运行以下代码时 当我通过浏览器运行它时它不起作用 但如果我把输出 str将其复制并粘贴到终端中 它工作得很好 造成这种情况的原因是什么 我该如何解决 目前我正在运行localhost php
  • 通过 $_SESSION 从一个脚本发送到另一个脚本期间数据丢失

    我正在尝试将一个充满属性的对象从一个 PHP 发送到另一个 PHP SESSION object obj where obj是一个用 foreach 循环指定的对象 foreach array of objects as obj SESSI
  • jQuery Mobile 表单验证

    我有一个移动网站 除了验证之外一切都工作正常 基本上我希望从用户那里获取值 然后在单独的页面 process php 上处理它们 但是 在这样做之前 我需要检查以确保字段已填充 我已经研究了几种方法来做到这一点 但似乎没有一种有效 我现在有
  • SQL 最近日期

    我需要在 php 中获取诸如 2010 04 27 之类的日期作为字符串 并在表中找到最近的 5 个日期 表中的日期保存为日期类型 您可以使用DATEDIFF http dev mysql com doc refman 5 1 en dat
  • 一次播种多行 laravel 5

    我目前正在尝试为我的用户表播种 如果我像这样尝试 2 行 就会失败 如果我只使用单个数组而不是 users 数组内的 2 个数组来创建一些假数据 那么效果很好 我做错了什么 正确的方法是什么 class UserTableSeeder ex
  • 使用正则表达式提取两个短语之间的所有单词[重复]

    这个问题在这里已经有答案了 我正在尝试使用以下正则表达式提取两个短语之间的所有单词 b item W w W 0 2 1 one W w W 0 3 business b b item W w W 0 2 3 three W w W 0 3

随机推荐

  • AJAX更新DOM后如何重新初始化(召回)FancyBox?

    我正在使用 widgetkit 插件 Joomla CMS 用于灯箱 由于 widgetkit 使用 fancybox 来显示灯箱 我在这里发布一个问题 当我不使用 AJAX 技术来更新 Joomla 网站的内容时 FancyBox 效果很
  • scipy.optimize.curve_fit,TypeError:不支持的操作数类型

    我已经进行了搜索 问题似乎类似于Python scipy 或 pow 不支持的操作数类型 list 和 list https stackoverflow com questions 9156208 python scipy unsuppor
  • 在 pyspark 中缓存数据帧

    我想更准确地了解pyspark中数据帧的方法缓存的使用 当我跑步时df cache 它返回一个数据帧 因此 如果我这样做df2 df cache 哪个数据帧在缓存中 是吗df df2 或两者 我找到了源代码DataFrame cache h
  • 如何用py2exe打包psutil?

    该应用程序在我的开发win8环境中运行良好 但是当它与py2exe打包并在生产机器上运行时 它抛出异常 无法在动态链接库 ntdll dll 中定位过程入口点 RtlIdnToAscii 日志文件的详细内容是 Traceback most
  • 使用文本字段编辑货币

    如何获得 JavaFX TextField 来编辑存储的没有派系数字 例如长整型 的货币 使用数据绑定 TextFormatter 和其他 javaFX 东西 目标应该是 Bo 拥有 LongProperty 货币价值以分为单位 可编辑的文
  • 禁用(删除)WooCommerce 4.3.x 中的营销菜单选项

    自 WooCommerce 发布以来4 3 x 之前修复了删除适用于的 营销 菜单选项的问题4 1 x不再起作用了 我想知道是否有人知道如何删除它4 3 x 我已经尝试了所有这些但没有成功 1 add filter woocommerce
  • C++ 使用 || 检查字符是否不在字符串中不工作

    我正在开发这款游戏 要求玩家再次玩 我习惯于检查条件是否不满足然后返回 false 所以最后我可以简单地添加 return true 这也有助于嵌套 如果我以相反的方式这样做 它会起作用 bool AskToPlayAgain cout l
  • 在 writeln 函数中写入撇号 - Pascal

    如何使用 Pascal 打印撇号writeln功能 例子 writeln My brother s book 行不通 因为s book超出了 写入 功能 因此编译器返回错误 Fatal Syntax error expected but i
  • 有人可以用最通俗的语言向我解释一下如何使用 EventArgs 吗?

    我知道他们和代表有关系 我已经尝试过 但我仍然不明白如何使用它们 我对事件处理程序了解一些 但我真正想知道的是如何使用大多数方法中的普通旧事件参数 下面的例子 void Page Load object sender EventArgs e
  • 使用 PHP Unit 测试特殊字符

    我正在使用 PHPUnit 和类从 Symfony2 测试我的控制器WebTestCase return self client gt request POST withdraw array amount gt 130 array arra
  • 单元测试中的 Xcode 内存泄漏检测

    运行单元测试时是否可以测试是否发生内存泄漏 我想检查我的内存管理是否正确处理 Thanks 您可以尝试使用泄漏检测仪器在仪器下运行单元测试 但是 如果您使用 OCUnit 则这仅适用于应用程序 捆绑包 测试 如果您碰巧使用其他东西 请告诉我
  • 使用Rails 5,如何使FriendlyId附加一个-“count+1”来重复slugs而不是UUID?

    显然 FriendlyId 已经更改了之前将数字序列附加到重复 slugs 的默认方法 这就是我想要的 现在使用 UUID Previous versions of FriendlyId appended a numeric sequenc
  • SwiftUI 通用拉动刷新视图

    我有一个 CustomScrollView 它包装了我的 HomeView 如果你下拉它会获取新数据 它工作正常 但问题是我想在多个视图中重用它 并且我不想为每个视图创建它的副本 我尝试过这样做var rootView View但它抛出一个
  • wordpress: previous_post_link() / next_post_link() 占位符

    我遇到了问题previous post link and next post link 功能 当没有之前的帖子时 该函数previous post link 不显示链接 同样对于next post link 和最后一篇文章 我想要一个占位符
  • 如何使用javascript将图像转换为二进制格式[重复]

    这个问题在这里已经有答案了 通过图像 url 将图像转换为二进制 我的网址如下 D MyProject Image image jpg 我想转换这个 image jpg 使用 JavaScript 转换为二进制格式字符串 在线找到了一个二进
  • 字体大小 1px 与 rem 单位一起使用

    我正在追求一种可以随着缩放而很好地缩放的布局 用户按 ctr cmd plus 为此 我需要尺寸与字体大小一起缩放 使用 em 单位太棘手 所以我正在考虑使用 rem 并复制旧 ie 的每个维度属性 我最初的想法是将 html 元素上的 f
  • 代号一:将图像保存到存储并创建小圆形预览

    我目前的图像有问题 1 我无法将图像保存到存储 因为不支持将其直接存储到存储 我希望用户能够用相机拍照 然后创建的照片必须保存在某个地方 以便我稍后可以再次检索它 你能告诉我怎么做吗 a 保存图像 b 如何检索它 我在 Stackoverf
  • 尝试在 laravel 5.5 中获取非对象的属性

    我试图显示我的变量值以查看页面 但它显示尝试获取非对象属性的错误 请有人帮助我 这是我的控制器 public function myAffiliates Request request if user id Sentinel getUser
  • C中字符数组输入输出的问题

    我编写了以下代码来读取字符数组并打印它 include
  • bcdiv 使用带有科学记数法的非常小的浮点导致“除以零”错误

    使用 bcdiv 我无法使用科学记数法除以小浮点数 工作代码 bcscale 30 a 1 b 0 00000001 result bcdiv a b var dump result 结果是 字符串 20 100000000 0000000