<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />간단한 계산을 수행하고 결과를 창에 표시하는 스크립트가 있습니다.
소계 = 100.05 ;
할인율 = 0.1 ;
할인금액 = 소계 * 할인율;
totalBeforeTax = 소계 - 할인 금액;
형식화된 메시지 = 연결 (
"소계:" , 반복하다 ( " " , 5 ), 체재 (소계, "통화" ), "\!N" ,
"할인율:" , 반복하다 ( " " , 5 ), 체재 (할인퍼센트, "퍼센트" ), "\!N" ,
"할인 량:" , 반복하다 ( " " , 5 ), 체재 (할인 량, "통화" ), "\!N" ,
"세전 총액:" , 반복하다 ( " " , 5 ), 체재 (세금 전 합계, "통화" ), "\!N"
);
형식화된 메시지 표시 = 새창 ( "결과" ,
라인업 상자 ( N 열 ( 1 ), 간격( 0 , 0 ), 테두리 상자 ( 왼쪽 ( 20 ), 오른쪽 ( 20 ), 맨 위( 20 ), 맨 아래( 20 ),
텍스트 상자 ( formattedMessage, << 글꼴 크기 설정 ( 14 ) ) )
),
보여주다 (소계, discountAmount, totalBeforeTax)
);
로그 및 출력 창에서 다음을 생성합니다.



그래서 사용 체재 (세금 전 합계, "통화" ), 결과 totalBeforeTax에서 "반올림"됩니다. 나는 이것을 처리하는 다양한 방법을 생각할 수 있지만 가장 권장되는 것이 무엇인지 궁금했습니다.
현재로서는 Big Number 계획이 없습니다.StackOverflow 링크에는 흥미로운 점이 많이 있었습니다.숫자로 수행할 작업에 따라 다른 솔루션이 적합할 수 있습니다.
크레이지
내가 생각한 또 다른 것은 문자열로 변환하고 Regex를 사용하는 것입니다.
Craige에게 감사드립니다. 실제로 저는 JMP가 Java의 BigDecimal 클래스에 액세스할 수 있도록 인터페이스를 구축하는 것을 고려하고 있었습니다. 다음 버전의 JMP에 이를 유형으로 포함할 계획이 있습니까?
discountAmount 계산을 반올림/바닥/상한 처리할 수 있습니다.Round에는 소수점 이하 자릿수에 대해 2로 설정할 수 있는 두 번째 인수가 있습니다.바닥과 천장은 비슷한 결과를 얻기 위해 floor(x*100)/100과 같은 것이 필요합니다.
소계 = 100.05;
할인율 = 0.1;
할인금액 = 둥근 (소계 * 할인율, 2) ;
totalBeforeTax = 소계 - 할인 금액;
show(discountAmount, totalBeforeTax);
할인금액 = 10.01;
totalBeforeTax = 90.04;
원래 코드의 형식 기능은 0.005를 두 자리로 반올림하여 반올림 또는 반내림의 칼날에 있습니다.프레젠테이션의 불일치는 한 경우에는 마이너스가 있고 다른 경우에는 플러스가 있는 값으로 인해 발생합니다. 두 값 모두 반올림되지만 계산에서 둘 중 하나의 discountAmount가 음수입니다.
JMP에서 사용되는 부동 소수점 숫자는 잘린 반복 이진 분수로 0.01과 같은 숫자를 나타냅니다.1/3이 정확히 0.333333333333이 아닌 것처럼 내부 표현도 정확하지 않습니다(1/2, 1/4, 1/8 등과 같은 이진 분수 제외). 0.01로 표시되는 100페니를 더하면 1.00에 매우 가깝지만 소수점 이하 16번째 자리에서 다른 숫자를 얻게 됩니다.이 아주 작은 오류로 인해 회계 패키지는 항상 다른 표현을 선택했습니다. java - 통화를 나타내기 위해 Double 또는 Float를 사용하지 않는 이유는 무엇입니까? - 스택 오버플로
합계 = 0;
For( i = 1, i <= 100, i++, 합계 += .01 );
show( 형식(전체,"고정",20,16) );
형식(합계, "고정", 20, 16) = "1.0000000000000007";
안녕 짐,
답장을 보내 주셔서 감사합니다. 따라서 Floor와 Ceiling은 가장 가까운 정수로 반올림됩니다. 형식 (x, "Currency")은 기본적으로 Round(x,2)를 사용하는 것으로 보입니다. "Currency" 형식은 반올림이 아닌 절단 방법을 사용한다고 생각할 수 있습니다.
저는 재무 보고를 많이 하지 않지만 반올림 오류에 대해 걱정해야 할 때 Round(), Ceiling() 및 Floor() 함수를 사용합니다.