- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
由于 PHP 中的 float 数据类型不准确,并且 MySQL 中的 FLOAT 比 INT 占用更多空间(并且不准确),因此我总是将价格存储为 INT,在存储之前乘以 100,以确保精确到小数点后 2 位精确的地方。但我认为 PHP 行为不当。示例代码:
echo "<pre>";
$price = "1.15";
echo "Price = ";
var_dump($price);
$price_corrected = $price*100;
echo "Corrected price = ";
var_dump($price_corrected);
$price_int = intval(floor($price_corrected));
echo "Integer price = ";
var_dump($price_int);
echo "</pre>";
产生的输出:
Price = string(4) "1.15"
Corrected price = float(115)
Integer price = int(114)
我很惊讶。当最终结果比预期低 1 时,我期望测试的输出看起来更像是:
Price = string(4) "1.15"
Corrected price = float(114.999999999)
Integer price = int(114)
这将证明 float 类型的不准确性。但为什么 Floor(115) 返回 114?
最佳答案
尝试将此作为快速修复:
$price_int = intval(floor($price_corrected + 0.5));
您遇到的问题不是 PHP 的错,所有使用实数和浮点运算的编程语言都有类似的问题。
货币计算的一般经验法则是永远不要使用 float (无论是在数据库中还是在脚本中)。您可以通过始终存储美分而不是美元来避免各种问题。分是整数,您可以自由地将它们相加,并乘以其他整数。每当显示数字时,请确保在最后两位数字前面插入一个点。
您得到 114 而不是 115 的原因是 floor
向最接近的整数向下舍入,因此 Floor(114.999999999) 变为 114。更有趣的问题是为什么 1.15 * 100 是 114.999999999而不是 115。原因是 1.15 并不完全是 115/100,但它要小一些,所以如果乘以 100,就会得到一个比 115 小一点点的数字。
以下是 echo 1.15 * 100;
作用的更详细说明:
PHP 打印令人惊讶的 Corrected Price = float(115)
(而不是 114.999...)的原因是 var_dump
不打印确切的数字 ( !),但它会打印四舍五入为 n - 2
(或 n - 1
)位的数字,其中 n 位是计算的精度。您可以轻松验证这一点:
echo 1.15 * 100; # this prints 115
printf("%.30f", 1.15 * 100); # you 114.999....
echo 1.15 * 100 == 115.0 ? "same" : "different"; # this prints `different'
echo 1.15 * 100 < 115.0 ? "less" : "not-less"; # this prints `less'
如果您要打印 float ,请记住:打印 float 时您并不总是能看到所有数字。
另请参阅 PHP float 开头附近的大警告文档。
关于php intval() 和 Floor() 返回值太低?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/812815/
我有 floor(sqrt(floor(x))) .这是真的: 内部floor是多余的。 外floor是多余的。 最佳答案 显然,外层不是多余的,因为例如,sqrt(2)不是整数,因此 floor(s
如何将 floor 函数应用于 float 或 double 值以获得整数。我得到了 double 值:4.4497083717E10float Value:4.4497084E10 在我的函数中。我
这个问题在这里已经有了答案: Using bitwise OR 0 to floor a number (7 个答案) 关闭 6 年前。 我刚刚在一些 JavaScript 中看到了这个快捷方式。
PHP 中的 floor 函数行为异常。对于 16 个十进制值,它给出了下限值,但通过增加 1 个小数点来舍入。 $int = 0.99999999999999999; echo floor($int
这是我的 HTML: floor 1: {{Math.floor( value ) }} floor 2: {{value }} floor 3: {{value |
(floor) 在 C 中实际上是如何工作的?据 Techonthenet 报道。 com, In the C Programming Language, the floor function ret
我正在将我的 MATLAB 代码转换为 Excel 文档,但在转换以下公式时遇到困难。 x=(b/N)*(-floor(N/2):floor(N/2)) 如果例如 b =2 且 N = 5结果将是
与 math.floor 相比,使用整数除法运算符在性能上有什么好处吗? 7 // 2 结束 math.floor(7/2) 最佳答案 整数除法比 math.floor 函数调用快得多: >>> im
我有一个关于 Haskell 的问题 floor函数 - 它应该返回“不大于参数的最大整数”,但表达式 floor 3.9999999999999999 返回 4 而不是 3。它可能与 Double
我想用可变的十进制长度(在 iphone sdk 中)将小数点后的 double 取整。 这里有一些例子可以告诉你我的意思 NSLog(@"%f",[self floorMyNumber:34.524
我知道 float 通常会包含舍入误差。 当您取 float (或 double )的底限或上限以将其转换为整数时,结果值是否准确,或者“底限”值是否仍然是近似值? 基本上,像 floor(3.141
我正在尝试用 C++ 实现一个系统,我可以在其中判断数字是否为整数(小数点后的所有内容均为零)。为此,我使用了 if (sqrt(answer/2) == floor(sqrt(answer/2)))
我正在编写一段代码,我需要处理不一定在 0 到 1 范围内的 uvs(2D 纹理坐标)。例如,有时我会得到一个 u 分量为 1.2 的 uv。为了处理这个问题,我正在实现一个包装,它通过执行以下操作导
CREATE TABLE table_name (col_a double(10,2), col_b double(10,2), col_c double(10,2)); INSERT INTO ta
这个问题在这里已经有了答案: Why does Math.round(0.49999999999999994) return 1? (5 个答案) 关闭 8 年前。 我开发了一个 c++ 应用程序(
我需要一个函数来将正 double 四舍五入到最接近的整数。潜伏 aorund 我发现这种非常优雅的方式 int x = floor(y + 0.5); 我写了一个简单的测试程序: double a
在 C89 中,floor() 返回一个 double 值。以下是否保证有效? double d = floor(3.0 + 0.5); int x = (int) d; assert(x == 3)
floor() 函数向下舍入为最接近的整数。 语法 floor(x) 参数 描述 x 必需。一个数。 说
有谁知道方法/功能如何Int()或 floor()实现的? 我正在寻找以下相应的实现 abs()功能。 Int Abs (float x){ if x > 0 return x;
我的问题如下:log(1000,10) 返回 3,但 floor(log(1000,10)) 返回 2。如何解决这个问题? 我的 php 版本是 5.6.30-0+deb8u1。 最佳答案 因为 lo
我是一名优秀的程序员,十分优秀!