我需要编写一个函数来比较字符串值“15.0000000000000001”到“15”,我正在使用MathNet。使用MathNet.Symbolics.Expression.Real只接受double。当我做以下
foreach ($your_array as $day) {
foreach ($day as $item) {
$name = array_pop($item);
$new[$name]['name'] = $name;
// check if the date is already set
if (isset($new[$name]['dateDetail'][$item['date']])) {
// if so, add the count of the current item
$new[$name]['dateDetail'][$item['date']]['cnt'] += $item['cnt'];
} else {
// if not, set it.
$new[$name]['dateDetail'][$item['date']] = $item;
}
}
}
// remove the date string keys
foreach ($new as &$name) {
$name['dateDetail'] = array_values($name['dateDetail']);
}
unset($name); // unset the reference
// remove the name string keys
$result = array_values($new);
以上计算结果为true.Double.Parse 15.0000000000000001返回15.我理解小数点后的0是无意义加倍,并且存储限制。
有人可以帮忙吗?
答案 0 :(得分:2)
根据经验,Float最多可以容纳14个连续数字以及10的幂。它将12.345678901234存储为1.2345678901234,功率为1:将两个数字加在一起,得到存储的数字。
在您的示例中,从前1到最后1个跨度为18位。浮点数不能将其存储在可用空间中,因此它会丢弃最低有效位 - 在本例中为最终1。这个示例中的两个数字应匹配。
但是,如果您将12.345678901234与12.345678901235进行比较则不会相等。
请注意,我提到的14个十进制数字是经验法则。根据这些数字的值,它可能会更少。
是的:这确实意味着Floats不精确,它们是近似值。