BN089-BS开发框架MVC4版/source20131023/Zephyr.Net/Zephyr.Utils/Document/Excel/NPOI/SS/Util/NumberComparer.cs
(开头部分) 7KB这里只显示每个文件的开头 60 行。登录后可以解锁完整代码。
using System;
using System.Collections.Generic;
using System.Text;
using Zephyr.Utils.NPOI.Util;
namespace Zephyr.Utils.NPOI.SS.Util
{
public class NumberComparer
{
/**
* This class attempts to reproduce Excel's behaviour for comparing numbers. Results are
* mostly the same as those from {@link Double#compare(double, double)} but with some
* rounding. For numbers that are very close, this code converts to a format having 15
* decimal digits of precision and a decimal exponent, before completing the comparison.
* <p/>
* In Excel formula evaluation, expressions like "(0.06-0.01)=0.05" evaluate to "TRUE" even
* though the equivalent java expression is <c>false</c>. In examples like this,
* Excel achieves the effect by having additional logic for comparison operations.
* <p/>
* <p/>
* Note - Excel also gives special treatment to expressions like "0.06-0.01-0.05" which
* evaluates to "0" (in java, rounding anomalies give a result of 6.9E-18). The special
* behaviour here is for different reasons to the example above: If the last operator in a
* cell formula is '+' or '-' and the result is less than 2<sup>50</sup> times smaller than
* first operand, the result is rounded to zero.
* Needless to say, the two rules are not consistent and it is relatively easy to find
* examples that satisfy<br/>
* "A=B" is "TRUE" but "A-B" is not "0"<br/>
* and<br/>
* "A=B" is "FALSE" but "A-B" is "0"<br/>
* <br/>
* This rule (for rounding the result of a final addition or subtraction), has not been
* implemented in POI (as of Jul-2009).
*
* @return <code>negative, 0, or positive</code> according to the standard Excel comparison
* of values <c>a</c> and <c>b</c>.
*/
public static int Compare(double a, double b)
{
long rawBitsA = BitConverter.DoubleToInt64Bits(a);
long rawBitsB = BitConverter.DoubleToInt64Bits(b);
int biasedExponentA = IEEEDouble.GetBiasedExponent(rawBitsA);
int biasedExponentB = IEEEDouble.GetBiasedExponent(rawBitsB);
if (biasedExponentA == IEEEDouble.BIASED_EXPONENT_SPECIAL_VALUE)
{
throw new ArgumentException("Special double values are not allowed: " + ToHex(a));
}
if (biasedExponentB == IEEEDouble.BIASED_EXPONENT_SPECIAL_VALUE)
{
throw new ArgumentException("Special double values are not allowed: " + ToHex(a));
}
int cmp;
// sign bit is in the same place for long and double:
bool aIsNegative = rawBitsA < 0;
bool bIsNegative = rawBitsB < 0;
后面还有 112 行代码,解锁后查看完整代码
24 小时内免费解锁 3 个项目,之后 1 算力/个。 规则说明
AI 解读 AI
登录后可用,每次 10 算力,解读结果公开显示在下面。
还没有人解读过这个文件。
