如何定义float是数字的一半?
说浮点值是整数的一半,例如0.5、1.5、10.5? 是什么最有效的方法. 首先,我想到的是: $is_half = (($number - floor($number)) === 0.5); 有更好的解决方案吗? 解决方案 由于浮点精度错误,您通常应该检查差异低于一定数量(但请注意,0.5 0.5是可准确表示的,因此这不是问题,但这是一般而言,浮子). 因此,您的代码对您的特定意义有好处,通常您可能想做: if (abs($number - floor($number) - $decimal)
0 2023-06-03
编程技术问答社区
PHP模棱两可的浮点问题
我一直在使用Laravel 5.0和本地(Homestead)构建应用程序,一切都按预期工作. 但是,当我部署项目时,许多问题显而易见.其中之一涉及浮子. Homestead为Php 5.6,而我的服务器为5.5.9.当我在本地系统上查看价格时,它看起来正确为9.99.但是,在我的服务器上它不能正确显示,而是为9.99000. 我的架构设置为浮动(12,5)的价格字段,因此还需要额外的填充. 我的问题只是PHP 5.5和5.6(甚至PDO/雄辩)之间有什么区别? 解决方案 PHP版本会导致这一点.但是,不同的MySQL驱动程序之间存在差异,这可能会导致您看到的问题. Homestead随附php5-mysqlnd已安装,这是" MySQL本地驱动程序".使用此驱动程序时,从数据库中获取的浮点和整数将被分配为PHP中的数字数据类型.如果您不使用本机驱动程序(php5-mysql),则将从数据库中获取的浮点和整数分配为PHP中的字符串. 以下代码演
0 2023-06-03
编程技术问答社区
将带逗号的字符串转换为带点的浮点。
当我尝试铸造 时 $value = floatval('14,5833'); to a float类型我期望具有dot的值,例如14.5833,但它返回我14,5833. 我应该怎么做? 我不想使用任何字符串替换功能. 解决方案 您有两个选择: 将语言环境设置为使用点代替昏迷的东西.例如. setlocale(lc_all,'fr_be.utf-8'); 继续内部使用逗号,当您要输出该数字时,请使用> number_format 其他解决方案 一个例子对我有帮助: 其他解决方案 检查decimal
0 2023-06-03
编程技术问答社区
PHP意外地扩大浮动值
有一个问题,php扩展了浮点值,例如241.09成为241.0899999999.问题是,扩展值包含在签名中,因此扩展使我的签名与具有原始未置入形式的实际数据匹配时具有不匹配.如何防止舍入?我的代码部分如下: round(floatval($resultParams["AvailableFunds"]), 2) 以某种方式,即使应用了圆形功能,仍会发生扩展.我如何防止它? 解决方案 是由 php浮点浮点精度: 浮点数的精度有限. 解决方案可能仅使用整数,例如将Float 123.45保存为12345,当您需要使用时,将其除以100,然后将其传递给number_format函数: $myNumView = number_format($myNum/100, 2, '.', '')+0; 这样做,number_format返回格式为1234567.89的字符串,然后通过执行+0 php将其转换为float(由于php Type Juggling ),
0 2023-06-02
编程技术问答社区
PHP小数点计算
我正在阅读,您必须在PHP中的浮点比较和计算时要谨慎.我不是PHP的专家,所以我想我会问社区在PHP中进行准确计算的最佳方法是什么. 我正在开发一个时间卡应用程序,该应用程序始终在本周输入.超过40个小时的任何事情都被认为是加时赛.然后,我想根据条目是总时间的百分比在每个时间条目中分发加时赛. 示例: 星期一= 10个小时 总时间= 50小时 总加班= 10小时 总时间的百分比(0.2)=星期一(10小时)/总时间(50小时) 加班时间分配至星期一(2小时)=总加班(10小时) *总时间的%(0.2) 现在在周一的加班时间进行2个小时的新条目,并从原始条目中减去2小时. 新条目: 星期一(8小时)=星期一 - 加班以分配到星期一(2小时) 星期一加时= 2小时 将整数用作您的原始条目时,情况似乎并不糟糕,但是当我开始使用浮子并且每天有多个时间条目时会发生什么?每次输入都会有一部分分配给它的加班费的一部分,但是我需要确保不要分配更多的加班
0 2023-06-02
编程技术问答社区
PHP-float数字与json_decode的精度错误
我尝试用JSON_DECODE函数在PHP 7.0.21中解码JSON时遇到问题.我能够用这些代码来复制此问题: 代码: 8.83E-6 ) 我还尝试使用不会更改输出的ini_set('precision', 8);更改精度. 我在网上发现的唯一修复程序是将数字更改为字符串的Regex替代品,但这是一个骇客和一个很好的解决方案.我不想将我所有的浮子号码更改为字符串. 为什么会发生这种情况,以及如何正确修复此问题,而无需添加大量开销,例如使用number_format.解析是否只是在JSON_DECODE中破裂? 解决方案 您可以使用 number_format C2
0 2023-06-02
编程技术问答社区
为什么PHP似乎对这个条件的评估是不正确的?
我在PHP中具有以下代码,我试图通过将变量抛入整数中来克服所述问题,并通过将所有值乘以100,然后在比较之前避免浮点数错误地点. 但是,以下代码仍将表达式评估为true并以红色而不是绿色上色,但是当我回应$ eq_left和$ eq_right的两个值时,它们是相同的,没有小数点. 这是代码: $eq_left = (int) ($eq_bal_CurrentAssets*100) + ($eq_bal_NonCurrentAssets*100) ; $eq_right = (int) ($eq_bal_Liabilities*100) + ($eq_bal_Taxation*100) + ($eq_bal_Equity*100) ; if ($eq_left !== $eq_right) { $color = 'red'; $diff = abs($eq_left - $eq_right); } else { $color =
0 2023-06-02
编程技术问答社区
PHP Printf as Float Precision
我正在尝试使用PHP的printf功能来打印用户的存储容量.完整的公式看起来像这样: echo printf("%.02f", ($size/(1024*1024))) . " GB"; 鉴于$size == (10 * 1024 * 1024),这应该打印出 10.00 GB 但事实并非如此.它打印10.04 GB.此外, echo printf("%.02f", 10) 导致 10.04 什么?!在给它一个整数转换为浮子时,它将10转换为10.00000009. 如何对此进行修复?显然,一种解决方案是将其打印成整数,但是值并不总是整数.它可能是5.57 GB,在这种情况下,此脚本的准确性非常重要. 和umm ... echo printf("%d", 10) 导致 102 这里有些错误. 解决方案 因此,显然printf并不是要回声.完全. 简单地将printf的实例更改为sprintf解决了
0 2023-06-01
编程技术问答社区
用PHP对json中的浮点数进行编码和解码而不损失精度
我想将JSON字符串解码为PHP对象,然后将对象再次返回到JSON字符串,而不会丢失JSON中的浮点数的精度. 如果您运行下面的样本,则输出为: JSON: string '{ "integer1": 10000, "integer2": 100000999499498485845848584584584, "float1": 1.121212, "float2": 8.226347662837406e+09 }' (length=130) JSON WITHOUT SPACES [1]: string '{"integer1":10000,"integer2":100000999499498485845848584584584,"float1":1.121212,"float2":8.226347662837406e+09}' (length=112) OBJECT: object(MyObject)[1] public 'integer1' => int 10
0 2023-06-01
编程技术问答社区
在PHP中进行四舍五入
$a = ((0.1 + 0.7) * 10) == (int)((0.1 + 0.7) * 10); php返回false. 有人可以向我解释,为什么会发生这种情况? 第一个返回8,第二7. 解决方案 引用 php手册中的大脂肪红色警告在浮点精度上: 典型的是,诸如0.1或0.7之类的简单十进制部分不能转换为其内部二进制对应物,而不会损失小精度.这可能会导致令人困惑的结果:例如,floor((0.1+0.7)*10)通常会返回7而不是预期的8,因为内部表示形式将是7.9. . 这是由于以下事实:不可能用数字有限的数字以十进制表示某些分数.例如,1/3以小数形式变为0.3. 因此,永远不要相信浮动数量的结果,而切勿比较浮点数的平等.如果需要更高的精度,任意精度数学功能 href =" http://de3.php.net/manual/en/ref.gmp.php" rel =" nofollow noreferrer"> gmp 功能可用. 其他
0 2023-06-01
编程技术问答社区
PHP:将一个数字四舍五入到小数点后16位上
嗨,我正在尝试将一个数字舍入 16个十进制数字 ,但直到 14个十进制数字才显示出来. 这是我的尝试: 输出: -0.16346153846154 预期输出: 0.1634615384615385 我知道 float 仅是14个小数位数. 16个小数位数 还有其他方法 解决方案 您可以在运行时设置此参数.通常最大16位数字 在大多数平台上的价值,较大的价值仅给出毫无意义或"虚构" 数字: ini_set("precision", "16"); 参见其他解决方案 最近,我们从Excel文件中读取金额(十进制数字)的问题,该文件的十进制数字是十进制之后的14位数字.使用高级算法来转换小数号的选项后,该问题是解决的.为此,我们
0 2023-06-01
编程技术问答社区
json_encode保留浮动值,因为它是
我需要将数组转换为JSON,并希望保留数据类型和类型. $a = array("num" => 10000.00); print_r(json_encode($a)); 在上面的示例10000.00被转换为10000.如何保留JSON中的所有内容. 解决方案 您在PHP 5.6+中可以做的最好的方法是确保将其编码为浮点.但是,这并不能保持精度: 10000.00); print_r(json_encode($a, JSON_PRESERVE_ZERO_FRACTION)); 如果数据类型和精度很重要,则需要发送其他参数,例如: $a = ["num" => [ "value" => 10000.0, "precision" => 2 ] ]; print_r(json_encode($a, JSON_PRESERVE_ZERO_FRACTION));
0 2023-05-31
编程技术问答社区
PHP如何将指数型数字转换为字符串?
我有一个以科学符号存储的数字 2.01421700079E+14 我尝试使用float,string,int,我无法获得 0201421700079085 2.01421700079e+14 1. echo (float)$awb; 2. echo number_format($awb, 0, '', ''); 3. echo (int)$awb; 4. echo (string)$awb; 2.01421700079E+14 = float 201421700079085 =编号 201421700079085 = int 2.01421700079E+14 =字符串 解决方案 printf 和朋友将这样做:
2 2023-05-31
编程技术问答社区
了解php中的浮点数
我知道这些问题可能会得到很多问,但是从我的阅读和测试中,它使我感到困惑,而我所做的很多阅读都使我更加困惑,因为它很复杂. 有些人似乎有简单比较的问题,但是我自己没有问题. 例如... $num1 = 27.64; $num2 = 27.64; if ($num1 == $num2) { echo 'Good!'; } else { echo 'Bad!'; } // Echo's "Good!" ...和 $num1 = 27.60; $num2 = 27.6; if ($num1 == $num2) { echo 'Good!'; } else { echo 'Bad!'; } // Echo's Good ...和 $num1 = 27.60; $num2 = 57.60; if ($num1
0 2023-05-31
编程技术问答社区
如何在PHP中解决这个问题?
$onethird = 1.0/3; $fivethirds = 1.0/3+1.0/3+1.0/3+1.0/3+1.0/3; $half = 1.0/2; $threehalf = 1.0/2+1.0/2+1.0/2; var_dump($onethird + $fivethirds == $half + $threehalf); 输出false,但众所周知:5/3+1/3=2=3/2+1/2 如何解决此问题? 解决方案 这是浮点数的IEEE 754表示的问题之一;表示形式不够准确,无法表示所有有理数. 这样做的方法是将差异与非常少量的差异进行比较,而不是平等: abs(($onethird + $fivethirds) - ($half + $threehalf)) = =第二值减去公差和 其他解决方案 这取决于您的比较的精确性 在
0 2023-05-31
编程技术问答社区
用sprintf打印浮点数
现在我有: printf('Rating: %.2F', $rating); 打印出: 4.00 只有在此之后有一些要显示的情况下,我才能显示领先的零? 例如: 4.00应该是4 4.20应为4.2 4.02应为4.02:) 解决方案 printf("Rating: %g\n", 4.00); printf("Rating: %g\n", 4.20); printf("Rating: %g\n", 4.02); 打印 Rating: 4 Rating: 4.2 Rating: 4.02 因此,将打印不含printf 的值
0 2023-05-31
编程技术问答社区
将一个数字字符串转换为浮点型数据
什么是在类似于intval()的PHP命令中,但对于小数是什么? 例如.我有字符串" 33.66",我想将其转换为十进制值,然后再将其发送到MSSQL. 解决方案 floatval() ? $f = floatval("33.66"); 您可以通过使用铸造而不是函数调用来刮掉类型转换的几纳秒.但这是在微观优化的领域中,所以不用担心,除非您每秒进行数百万此操作. $f = (float) "33.66"; 我还建议学习如何使用 sscanf() ,因为有时这是最方便的解决方案. list($f) = sscanf("33.66", "%f"); 其他解决方案 如果您是指浮点: $var = floatval("33.66") 或 $var = (float)"33.66"; 如果您需要十进制的确切精度,则PHP中没有这种类型.有一个其他解决方案 您可以尝试您可以尝试通过我不确定Sprintf是否会在内部将值转换为格式化的浮点,
0 2023-05-31
编程技术问答社区
为什么MySQL返回一些科学符号的浮点数,而不是其他?
我正在编写一个PHP脚本,该脚本通过浮点值的DB表,这些脚本往往很小,例如: 0.00052 0.00134 0.00103 0.00149 0.00085 0.00068 0.00077 0.00088 0.00169 0.00063 出于我未知的原因,有些值出现在DB中的科学符号,例如: 1.12305E-06 该表设置为浮动,我尝试了PHP中的各种功能,以迫使数字显示为十进制,无济于事.尽我所能,在所有情况下,我都无法获得该数字的始终小数. 关于如何解决这个问题的任何建议?尝试打字到(float)并使用number_format()和其他几个选项,但每次都没有更改. 解决方案 似乎对CLI(以及其他地方)显示的内容有六位数的限制.您拥有的示例是1.12305E -06,它是0.00000112305,将显示为0.00000-尽管显然不是零. 如果您坚持使用浮子或双打,则必须使用round(columnName,5)之类的东西强迫它们,以将显
4 2023-05-30
编程技术问答社区