십진법의 목적은 무엇입니까?1, 10진수.0, 10진수.마이너스 원 인.그물
간단한 질문 - 소수 유형이 이러한 상수를 정의하는 이유는 무엇입니까?왜 귀찮게 굴어요?
저는 이것이 컴파일러에 대한 가능한 사용이나 영향이 아닌 언어에 의해 정의되는 이유를 찾고 있습니다.애초에 이걸 왜 거기에 넣었을까요?컴파일러는 Decimal만큼 쉽게 0m를 인라인할 수 있습니다.제로, 그래서 나는 그것을 컴파일러 바로가기로 사지 않을 것입니다.
작은 설명.실제로는 정적 읽기 전용 값이며 상수가 아닙니다.그것은 에 뚜렷한 차이가 있습니다.다양한 컴파일러에 의해 상수 값이 인라인화되므로 컴파일된 어셈블리에서 상수 값의 사용을 추적할 수 없기 때문에 Net입니다.그러나 정적 읽기 전용 값은 복사되지 않고 대신 참조됩니다.이것은 그것들의 사용을 분석할 수 있다는 것을 의미하기 때문에 당신의 질문에 유리합니다.
리플렉터를 사용하여 BCL을 탐색하면 VB 런타임 내에서만 MinusOne 및 Zero가 사용된다는 것을 알 수 있습니다.기본적으로 10진수 값과 부울 값 사이의 변환을 제공하기 위해 존재합니다.MinusOne이 우연히 사용되는 이유는 바로 오늘 다른 스레드에서 나왔습니다 (link)
이상하게도, 십진법을 보면요.아무 데도 사용되지 않는 한 가지 값입니다.
그것들이 명확하게 정의된 이유에 대해서는...저는 어렵고 빠른 이유가 있는지 의심스럽습니다.구체적인 성과는 없고 그들의 존재에 기인할 수 있는 약간의 편의 조치만 있는 것으로 보입니다.제 생각에 그것들은 BCL 개발 중 누군가가 편의를 위해 추가한 것이고 결코 제거되지 않은 것 같습니다.
편집
속으로 파고들었습니다.const
@Paleta의 코멘트 후에 조금 더 발행합니다.#의 C#는 다음과 .Decimal.One
를 사용합니다.const
수식어 그러나 그것은 a로 방출됩니다.static readonly
IL 레벨에서.C# 컴파일러는 몇 가지 트릭을 사용하여 이 값을 사실상 다음과 구별할 수 없도록 만듭니다.const
(예: 리터럴 인라인).이것은 이 트릭(VB)을 인식하는 언어로 나타날 것입니다.Net은 이를 인식하지만 F#은 인식하지 않습니다).
일부 .NET 언어는 십진수 리터럴을 지원하지 않으며, 이러한 경우 십진수를 쓰는 것이 더 편리하고 빠릅니다.새 소수점(1) 대신 1점을 입력합니다.
Java의 BigInteger 클래스도 같은 이유로 ZERO와 ONE을 가집니다.
그것에 대한 제 의견은 그들이 마법의 숫자를 피하는 것을 돕기 위해 거기에 있다는 것입니다.
마법의 숫자는 기본적으로 코드의 어느 곳에나 있습니다. 당신은 임의의 숫자를 가지고 있습니다.예:
int i = 32;
이것은 왜 제가 32로 설정되었는지, 32가 무엇을 의미하는지, 아니면 32가 되어야 하는지 아무도 알 수 없다는 점에서 문제가 있습니다.마법같고 신비롭습니다.
비슷한 맥락에서, 나는 종종 이것을 하는 코드를 볼 것입니다.
int i = 0;
int z = -1;
0과 -1로 설정되는 이유는 무엇입니까?이것은 단지 우연의 일치입니까?그들이 무슨 의미가 있나요?누가 알겠는가?
하는 동안에Decimal.One
,Decimal.Zero
등은 응용프로그램의 맥락에서 값이 의미하는 바를 알려주지 않습니다(아마도 0은 "경고" 등을 의미할 수 있습니다). 값이 의도적으로 설정되어 있고 의미가 있을 수도 있습니다.
완벽하지는 않지만, 이것은 당신에게 아무것도 말하지 않는 것보다 훨씬 낫습니다 :-)
참고 최적화를 위한 것이 아닙니다.다음 C# 코드를 준수합니다.
public static Decimal d = 0M;
public static Decimal dZero = Decimal.Zero;
idasm을 사용하여 생성된 바이트 코드를 볼 때 두 옵션 모두 동일한 MSIL을 생성합니다.System.Decimal
값 형식입니다.Decimal.Zero
문자 그대로의 값을 사용하는 것 이상의 "최적"은 아닙니다.
그 세 가지 가치는 아아아!!!
저는 그들이 제가 '추락 1'이라고 부르는 것과 관련이 있을 수 있다고 생각합니다.
다음 공식을 가지고 있다고 말합니다.
1.11666 + (y) = (z)2.00000
그러나 x, z는 0.11과 2.00으로 반올림되고 (y)를 계산하라는 메시지가 표시됩니다.
그래서 당신은 생각할지도 모릅니다.y = 2.00 - 1.11
실제로 y는 0.88과 같으나 0.89가 됩니다.(0.01의 차이가 있음).
x와 y의 실제 값에 따라 결과는 -0.01부터 +0.01까지 다양하며, 경우에 따라 뒤에 오는 1의 값을 처리할 때와 쉽게 하기 위해 뒤에 오는 값이 다음과 같은지 확인할 수 있습니다.Decimal.MinusOne / 100
,Decimal.One / 100
또는Decimal.Zero / 100
그것들을 고치기 위해.
이것이 제가 그것들을 사용한 방법입니다.
언급URL : https://stackoverflow.com/questions/745591/what-is-the-purpose-of-decimal-one-decimal-zero-decimal-minusone-in-net
'source' 카테고리의 다른 글
Mongoose 닫히지 않은 연결을 열려고 합니다. (0) | 2023.05.09 |
---|---|
Swift 4에서 String 하위 문자열을 사용하려면 어떻게 해야 합니까? 'substring(to:)'은 더 이상 사용되지 않습니다.문자열 슬라이싱 첨자를 '부분 범위 from' 연산자와 함께 사용하십시오. (0) | 2023.05.09 |
현재 Git 분기를 마스터 분기로 설정 (0) | 2023.05.09 |
VB의 txt 파일에 텍스트를 만들고 추가하는 중입니다.그물 (0) | 2023.05.09 |
psycopg2 설치 오류, -lssl에 대한 라이브러리를 찾을 수 없습니다. (0) | 2023.05.09 |