source

십진법의 목적은 무엇입니까?1, 10진수.0, 10진수.마이너스 원 인.그물

nicesource 2023. 5. 9. 22:48
반응형

십진법의 목적은 무엇입니까?1, 10진수.0, 10진수.마이너스 원 인.그물

간단한 질문 - 소수 유형이 이러한 상수를 정의하는 이유는 무엇입니까?왜 귀찮게 굴어요?

저는 이것이 컴파일러에 대한 가능한 사용이나 영향이 아닌 언어에 의해 정의되는 이유를 찾고 있습니다.애초에 이걸 왜 거기에 넣었을까요?컴파일러는 Decimal만큼 쉽게 0m를 인라인할 수 있습니다.제로, 그래서 나는 그것을 컴파일러 바로가기로 사지 않을 것입니다.

작은 설명.실제로는 정적 읽기 전용 값이며 상수가 아닙니다.그것은 에 뚜렷한 차이가 있습니다.다양한 컴파일러에 의해 상수 값이 인라인화되므로 컴파일된 어셈블리에서 상수 값의 사용을 추적할 수 없기 때문에 Net입니다.그러나 정적 읽기 전용 값은 복사되지 않고 대신 참조됩니다.이것은 그것들의 사용을 분석할 수 있다는 것을 의미하기 때문에 당신의 질문에 유리합니다.

리플렉터를 사용하여 BCL을 탐색하면 VB 런타임 내에서만 MinusOne 및 Zero가 사용된다는 것을 알 수 있습니다.기본적으로 10진수 값과 부울 값 사이의 변환을 제공하기 위해 존재합니다.MinusOne이 우연히 사용되는 이유는 바로 오늘 다른 스레드에서 나왔습니다 (link)

이상하게도, 십진법을 보면요.아무 데도 사용되지 않는 한 가지 값입니다.

그것들이 명확하게 정의된 이유에 대해서는...저는 어렵고 빠른 이유가 있는지 의심스럽습니다.구체적인 성과는 없고 그들의 존재에 기인할 수 있는 약간의 편의 조치만 있는 것으로 보입니다.생각에 그것들은 BCL 개발 중 누군가가 편의를 위해 추가한 것이고 결코 제거되지 않은 것 같습니다.

편집

속으로 파고들었습니다.const@Paleta의 코멘트 후에 조금 더 발행합니다.#의 C#는 다음과 .Decimal.One를 사용합니다.const수식어 그러나 그것은 a로 방출됩니다.static readonlyIL 레벨에서.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

반응형