MathNet真正的双精度问题

时间:2016-06-20 18:25:42

标签: c# .net mathnet

我需要编写一个函数来比较字符串值“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是无意义加倍,并且存储限制。

有人可以帮忙吗?

1 个答案:

答案 0 :(得分:2)

根据经验,Float最多可以容纳14个连续数字以及10的幂。它将12.345678901234存储为1.2345678901234,功率为1:将两个数字加在一起,得到存储的数字。

在您的示例中,从前1到最后1个跨度为18位。浮点数不能将其存储在可用空间中,因此它会丢弃最低有效位 - 在本例中为最终1。这个示例中的两个数字应匹配。

但是,如果您将12.345678901234与12.345678901235进行比较则不会相等。

请注意,我提到的14个十进制数字是经验法则。根据这些数字的值,它可能会更少。

是的:这确实意味着Floats不精确,它们是近似值。