Double 대 FLOAT - 이해할 수 없는 MathFloor 오류 - 페이지 7

 
Maxim Kuznetsov :
목표에 따라 때로는 완전히 정수로 전환할 가치가 있습니다. 신경이 많이 쓰입니다 :-) 어쩐지 여러 레벨을 정확하게 표시해야 하는 작업이 있었는데 처음에는 더블에 지쳐서 0에서 전체 포인트로 모든 것을 옮기고 모든 것이 쉽고 간단하고 쉬워졌습니다. 오류 없이.
그게 바로 내가 한 일이다. 정수로 변환됩니다.
 
Vladimir :

작업에 필요한 경우가 아니면 반올림을 사용하지 마십시오.


문제의 사실은 작업이 다르다는 것입니다 :-)

 

반올림에 MathFloor 또는 MathCeil 사용하는 경우 원래 결과를 원하는 정확도로 정규화해야 합니다.

계산할 때 정수 대신 분수가 나올 수 있고 이 "꼬리" 때문에 숫자가 잘못 반올림 되어 결과가 올바르지 않습니다.
예를 들어:

double point= 0.01 ;
Print ( DoubleToStr ( 1156.12 /point, 15 ));
Print ( NormalizeDouble ( 1156.12 /point, _Digits ));

이제 MathFloor 로 반올림해 보겠습니다.

double point= 0.01 ;
Print ( DoubleToStr ( MathFloor ( 1156.12 /point), 15 ));
Print ( MathFloor ( NormalizeDouble ( 1156.12 /point, _Digits )));
 

숫자 1.05를 정규화하면 기본적으로 MathFloor 함수인 1.1로 정규화됩니다. 필요한 값이 아닌 값을 반환합니다 :-)

나는 MathFloor를 전혀 사용하지 않을 것이기 때문입니다.

하지만 과제는 다릅니다.

 

Но задача то другая.  

왜 또? 방금 결과를 반올림해야 한다고 썼습니다. MathFloor는 바로 그 작업을 수행합니다.

 
Taras Slobodyanik :

왜 또? 방금 결과를 반올림해야 한다고 썼습니다. MathFloor는 바로 그 작업을 수행합니다.

예!!! 하지만 정규화를 수행하면 수학에서 반올림되고 MathFloor 는 더 이상 의미가 없습니다.

 

숫자가 1156.12인 예제 바로 위에 이 숫자는 1156.119999999999891로 메모리에 저장됩니다.

즉, 정수로 변환을 통해 100분의 1 단위로 반올림하려고 하면 1156.12 대신 1156.11이라는 숫자를 얻게 됩니다. 이것이 "기능"이기 때문에 의아해합니다.

 
Taras Slobodyanik :

숫자가 1156.12인 예제 바로 위에 이 숫자는 1156.119999999999891로 메모리에 저장됩니다.

즉, 정수로 변환을 통해 100분의 1 단위로 반올림하려고 하면 1156.12 대신 1156.11이라는 숫자를 얻게 됩니다. 이것이 "기능"이기 때문에 의아해합니다.

네 감사합니다.