Microsoft MVP성태의 닷넷 이야기
.NET Framework: 419. C# - BigDecimal [링크 복사], [링크+제목 복사],
조회: 32083
글쓴 사람
정성태 (techsharer at outlook.com)
홈페이지
첨부 파일

C# - BigDecimal

다음과 같은 질문이 있었습니다. ^^

BigDecimal 라이브러리
; http://social.msdn.microsoft.com/Forums/ko-KR/75cb5db0-6b78-4dc0-bd35-9f44f8c9ff9e/bigdecimal-?forum=dotnetko

BigDecimal의 대용으로 C#의 BigInteger가 있다는 답변이 뒤따르는데요. 사실 BigInteger와 BigDecimal은 소수점 처리 여부 자체에서 다르다는 특징이 있습니다. 이것은 int와 decimal의 차이에서 직관적인 유추가 가능합니다.

일례로, 자바로 다음과 같이 코드를 만들면 출력 결과가 10.5가 나오지만,

import java.math.BigDecimal;

public class testC 
{
    public static void main(String [] args)
    {
        BigDecimal bd = new BigDecimal(10.5);
        System.out.println(bd); // 출력: 10.5
    }
}

C#의 BigInteger로 동일하게 소스코드를 구성하면 출력 결과가 10이 나옵니다.

using System;
using System.Numerics;

class Program
{
    static void Main(string[] args)
    {
        BigInteger bi = new BigInteger(10.5);
        Console.WriteLine(bi); // 출력: 10
    }
}

그래서 나름대로 ^^ BigDecimal 구현체를 검색해서 추천한 것입니다.

BigDecimal.cs 
; https://gist.github.com/nberardi/2667136

실제로 위의 BigDecimal을 사용하면 소수점 보존을 해줍니다.

BigDecimal bd = new BigDecimal(10.5);
Console.WriteLine(bd.ToString()); // 출력: 10.5

BigDecimal 구현을 내부적으로 BigInteger로 이용했다고 해서 동일하다고 보면 안되겠지요. ^^

물론, "BigDecimal.cs"에 있는 소스코드가 자바의 BigDecimal의 기능을 모두 구현하지는 않았을 것입니다.

선택적으로는 다음고 같은 것들이 있군요.

dotnet-big-decimal 
; http://code.google.com/p/dotnet-big-decimal/source/browse/BigDecimal/BigDecimal.cs

W3b.Sine
; http://sine.codeplex.com/SourceControl/latest#W3b.Sine/W3b.Sine/Numbers/BigNum.cs

A BigFloat Library in C#
; https://www.codeproject.com/Articles/5375327/A-BigFloat-Library-in-Csharp

재미있는 글이 하나 더 있습니다.

BigInteger/BigDecimal
; http://geekswithblogs.net/gyoung/archive/2006/05/01/76869.aspx

위의 글에서는 .NET 1.1에 있었던 vjslib.dll을 참조 추가해서 사용하는 것을 언급하고 있는데요. 실제로 .NET 1.1이 설치된 "C:\WINDOWS\Microsoft.NET\Framework\v1.1.4322" 폴더에서 vjslib.dll을 가져와 참조 추가하고 vjsnativ.dll 파일을 exe와 같은 폴더에 복사해 주니 다음과 같이 사용할 수 있었습니다.

using System;
using java.math;

class Program
{
    static void Main(string[] args)
    {
        BigDecimal bd = new BigDecimal(10.5);
        Console.WriteLine(bd); // 출력 결과: 10.5000000000000000000000000000000000000000000000000
    }
}

문제가 있다면 .NET 1.1은 64비트 버전이 없기 때문에 x64 용 EXE에서는 사용할 수 없습니다. ^^

첨부 파일은 위의 java.math와 "BigDecimal.cs"에 대한 예제 코드를 포함하고 있습니다.




[이 글에 대해서 여러분들과 의견을 공유하고 싶습니다. 틀리거나 미흡한 부분 또는 의문 사항이 있으시면 언제든 댓글 남겨주십시오.]







[최초 등록일: ]
[최종 수정일: 2/28/2024]

Creative Commons License
이 저작물은 크리에이티브 커먼즈 코리아 저작자표시-비영리-변경금지 2.0 대한민국 라이센스에 따라 이용하실 수 있습니다.
by SeongTae Jeong, mailto:techsharer at outlook.com

비밀번호

댓글 작성자
 




... 106  107  108  109  110  111  112  113  114  115  [116]  117  118  119  120  ...
NoWriterDateCnt.TitleFile(s)
11058정성태10/8/201624005개발 환경 구성: 303. Windows 10 Bash Shell - 한글 환경을 영문으로 바꾸고 싶다면?
11057정성태10/8/201618527오류 유형: 358. Windows 10 bash shell - sudo: unable to resolve host ...
11056정성태10/8/201622326개발 환경 구성: 302. Windows 10 bash shell 시작 시 [...] packages can be updated.
11055정성태10/8/201623331.NET Framework: 608. double 값을 구할 때는 반드시 피연산자를 double로 형변환! [6]
11054정성태10/5/201627346개발 환경 구성: 301. "Let's Encrypt" SSL 인증서를 Azure Cloud Services(classic)에 업데이트하는 방법
11053정성태10/5/201621993.NET Framework: 607. C# try/catch/finally의 IL 코드 표현
11052정성태9/27/201635925개발 환경 구성: 300. C# DLL에서 Win32 C/C++처럼 dllexport 함수를 제공하는 방법 [7]파일 다운로드1
11051정성태9/25/201623089개발 환경 구성: 299. docker - c:\programdata\docker\windowsfilter 폴더 정리하는 방법파일 다운로드1
11050정성태9/24/201627887VC++: 101. 반올림하지 않고 double 변수 값 출력하는 방법 [3]
11049정성태9/24/201622316오류 유형: 357. 윈도우 백업 시 오류 - 0x81000037
11048정성태9/24/201623386VC++: 100. 전역 변수 유형별 실행 파일 크기 차이점
11047정성태9/21/201627294기타: 61. algospot.com - 양자화(Quantization) 문제 [2]파일 다운로드1
11046정성태9/15/201628991개발 환경 구성: 298. Windows 10 - bash 실행 시 시작 디렉터리 자동 변경
11045정성태9/15/201621638Windows: 119. Windows 10 - bash 명령어 창을 실행했는데 바로 닫히는 경우
11044정성태9/15/201621853VS.NET IDE: 112. Visual Studio 확장 - 편집 화면 내에서 링크를 누르면 외부 웹 브라우저에서 열기
11043정성태9/15/201622564.NET Framework: 606. .NET 스레드 콜 스택 덤프 (7) - ClrMD(Microsoft.Diagnostics.Runtime)를 이용한 방법 [1]파일 다운로드1
11042정성태9/14/201620644오류 유형: 356. Unknown custom metadata item kind: 6
11041정성태9/10/201620747.NET Framework: 605. CLR4 보안 - yield 구문 내에서 SecurityCritical 메서드 사용 불가 - 2번째 이야기
11040정성태9/10/201628227.NET Framework: 604. C# Windows Forms - Drag & Drop 예제 코드 [2]파일 다운로드1
11039정성태9/9/201624051오류 유형: 355. Visual Studio 빌드 오류 - error CS0122: '__ComObject' is inaccessible due to its protection level
11038정성태9/9/201626683VC++: 99. 서로 다른 프로세스에서 WM_DROPFILES 메시지를 전송하는 방법파일 다운로드1
11037정성태9/8/201629859.NET Framework: 603. socket - shutdown 호출이 필요한 사례파일 다운로드1
11036정성태8/29/201625682개발 환경 구성: 297. 소스 코드가 없는 닷넷 어셈블리를 디버깅할 때 지역 변숫값을 확인하는 방법
11035정성태8/29/201621582오류 유형: 354. .NET Reflector - PDB 생성 화면에서 "Clear Store"를 하면 "Index and length must refer to a location within the string" 예외 발생
11034정성태8/25/201625573개발 환경 구성: 296. .NET Core 프로젝트를 NuGet Gallery에 배포하는 방법 [2]
11033정성태8/24/201623504오류 유형: 353. coreclr 빌드 시 error C3249: illegal statement or sub-expression for 'constexpr' function
... 106  107  108  109  110  111  112  113  114  115  [116]  117  118  119  120  ...