다음은 내가 수행중인 일부 수학을위한 테스트 코드입니다.C# 수치 오류 드라이브 미친
왜 C#이 다르게 처리됩니까?
EXCEL
분자 = -0.161361101510599 * 10000000 분모 = = (- 1 * (100-81.26)) * (100분의 10,000,000)
다음은 내가 수행중인 일부 수학을위한 테스트 코드입니다.C# 수치 오류 드라이브 미친
왜 C#이 다르게 처리됩니까?
EXCEL
분자 = -0.161361101510599 * 10000000 분모 = = (- 1 * (100-81.26)) * (100분의 10,000,000)
이 가장 가능성이 때문에 번호가 C#을 대 엑셀에 표시되는 방법. 반올림 오류/차이점은 다른 플랫폼이나 다른 소프트웨어를 사용하여 고도의 정확성을 부여 할 때 일반적입니다.
편집 : 물론 처음부터 다른 숫자가 입력 되었기 때문일 수 있습니다. 복잡한 답을 찾아 나를 찾아라!
프로그래머는 큰 그림을 놓치고 뻔한 (잘 - 나는 ... ...) 사례를 간과하는 것으로 유명합니다!
다른 답변에 대한 의견을 듣고 결과 (0.8610517689999946638207043757m)를 얻고 있다고 말합니다. 당신이 그렇게처럼 둥글게 경우
Math.Round(0.8610517689999946638207043757m, 12);
그것은 출력 : 숫자 컴퓨팅 신뢰 엑셀 작업을 우리의 0861051769000
많지 않습니다 올바르게 2 개 1 자리 숫자를 추가합니다. Mathematica에서 계산을 실행하여 각 분수를 0으로 오른쪽으로 확장하여 64 자리를 제공했습니다. 결과는 다음과 같습니다.
0.861051771611526147278548559231590181430096051227321237993596585
이 경우 Excel이 아닌 C#으로 이동하십시오. 그리고 두 번째와 세 번째 생각에서, 모든 경우에 숫자 컴퓨팅에 대한 부적합 성이 널리 알려져 있고 잘 설명되어있는 Excel이 아닌 C#으로 이동하십시오.
Excel은 일반적으로 꽤 높은 수준의 정밀도를 가지고 있으며, IIRC는 'double', 아마도 96/128-bit보다 낫다. – leppie
Excel에서 숫자 p-o-v의 실제 문제는 IEEE 산술이나 합리적인 수퍼 집합을 구현하지 않는 것입니다. 컴퓨터에서 실제 (실제 및 실제) 산술 연산을 수행하려는 불미스러운 점을 숨기기 위해 설계된 것 같습니다. 이것은 목표 청중에 매우 잘 맞을 수 있지만, 적절한 숫자 계산을하기 위해서는 그것을 풀어내는 것이 좌절감을 느낄 수 있습니다. –
엑셀은 15 자리의 유효 자릿수를 저장합니다. "Why does Excel Give Me Seemingly Wrong Answers?"문서를 읽어보십시오.
다른주의 사항; 아마도 연산의 수를 줄이기 위해 산술 연산을 단순화해야 할 것입니다. 일반적으로 (항상 그런 것은 아님) f.p.에서 더 나은 결과를 얻을 수 있습니다. 산수.
val = noiseTerm/(81.26/100 - 1)
는 수학적 방정식에 해당하며, 특히 사용자의 제 반대로 상기 scalingFactor 완전히 제산 3 개 동작을 포함하므로 전혀 필요하지 않다.
우선, 대부분의 경우 Excel에서는 C#처럼 기본 연산에 배정 밀도 부동 소수점 연산을 사용합니다.
특정 경우에 따라 C# 코드가 Excel 수식과 일치하지 않습니다. Excel 공식을 사용하는이 C# 코드를 사용해보십시오.
static void Calc()
{
double numerator = -0.161361101510599 * 10000000.0;
double denominator = (-1.0 * (100.0 - 81.26)) * (10000000.0/100.0);
double result = numerator/denominator;
Console.WriteLine("result={0}", result);
}
출력을 실행하고 출력이 0.861051768999995임을 확인하십시오.
이제 사용자 지정 숫자 형식이 "0.00000000000000000"인 Excel에서 결과의 서식을 지정하면 Excel에서 C#과 동일한 결과를 얻게됩니다. 기본적으로 Excel에서는이 숫자를 12 자리의 유효 자릿수로 반올림하는 "일반"형식을 사용합니다. 위의 형식으로 변경하면 Excel에서 15 자리의 정밀도 (Excel에서 숫자를 표시하는 데 사용하는 최대 유효 자릿수)를 표시하도록합니다 (내부적으로 C# 이중 형식과 마찬가지로 15 자리 숫자의 정밀도가 있음) . 다음과 같은 코드을 실행하여 (대신 15 중요한 자리로 반올림) 유효 숫자를 15 + 표시하는 C#을 강제 할 수
는 :
는static void Calc()
{
double numerator = -0.161361101510599 * 10000000.0;
double denominator = (-1.0 * (100.0 - 81.26)) * (10000000.0/100.0);
double result = numerator/denominator;
Console.WriteLine("result={0:R}", result);
}
이 코드를 출력 0.8610517689999948는 ...하지만 AFAIK 방법이 없습니다 Excel에서 15 자리 이상을 표시하도록합니다.
나는 또한 십진법을 시도했다 - 아무런 차이가 없음 –
LOL, 엑셀, 정확하게 같은 문장에 맞지 않는다. 정확한 산술을 원한다면, 부동 소수점이 아닌 rationalals를 사용하자. – leppie
"내가 Excel에서 이것을하면"이라고 말하면서 분명히 할 수 있습니다 : * Excel * 또는 * VBA *를 언급합니까? 그들은 그들의 기능 중 일부와 다르게 행동합니다. –