문제

함수에 주어진 숫자를 가장 가까운 정수로 반올림하는 함수가 있습니다.

<script type='text/javascript'>
Math.roundNumber = function(a,b){
    if(!isNaN(parseInt(a))){
        c = Math.pow(10,b);
        return (Math.round(a*c)/c);
    }
    return false;
}
</script>

그러나 함수에 입력된 해당 숫자는 가장 가까운 1펜스까지만 반올림되어야 하지만 소수점 이하 두 자리까지 반올림되어야 한다는 점을 알게 되었습니다.

예를 들어

15.236562213541684 would = 15.24  
9846.65456169846 would = 9846.66

나는 그것이 수익을 바꾸는 경우라고 생각했다 (Math.round (ac)/c);돌아 오기 위해 (Math.ceil (ac)/c);

분명히 나는 ​​매우 틀렸다.

이 문제에 대해 도움이 필요하신가요?

** 편집하다 **

내가 달성하려는 공식은 다음과 같습니다. 아마도 도움이 될 것입니다.

a = intrest price
b = terms
c = a/b
d = c*(b-1)
e = a-d

예를 들면

a = 295.30
b = 156
c = 295.30/156 = 1.90 (rounded up to nearest decimal as above)
d = 1.90 * (b-1) = 294.50
e = 295.30 - 294.50 = 0.80

누구든지 위의 작업을 수행할 수 있는 기능을 사용할 수 있나요?

여기 수식을 포함하여 내가 가지고 있는 현재 코드에 대한 링크입니다...이것은 내가 JavaScript를 처음 시작할 때 만든 매우 오래된 공식이지만(지금은 꽤 오래 전입니다), 그때와 마찬가지로 지금도 나아지지 않습니다.

위의 기능과 일치하도록 작동하지 않는 이유를 확인할 수 있는 사람이 있습니까?

도움이 되었습니까?

해결책

function currency_fix(number)
{
    var unfixed_number = Math.ceil(number.toFixed(5) * 100) / 100;
    return unfixed_number.toFixed(2)
}

var a = currency_fix(295.30)
var b = currency_fix(156)
var c = currency_fix(a / b)
var d = currency_fix(c * (b - 1))
var e = currency_fix(a - d)

document.write(
    'a = ' + a + '<br />' +
    'b = ' + b + '<br />' +
    'c = ' + c + '<br />' +
    'd = ' + d + '<br />' +
    'e = ' + e + '<br />'
)

// OUTPUT
//a = 295.30
//b = 156.00
//c = 1.90
//d = 294.50
//e = 0.80

이 경우 원하는 결과를 제공하기 위해 얻었습니다.매번 작동할지는 확실하지 않지만 작동하는 것 같습니다.먼저 원하는 대로 작동하는지 확실히 확인하겠습니다.

다른 팁

이를 위한 내장 함수가 이미 있습니다. Number.toFixed(numDigits), 이것을 사용하는 것은 어떨까요?

매개변수:숫자
소수점 뒤에 표시할 자릿수입니다.이는 0에서 20 사이의 값일 수 있으며 구현에서는 선택적으로 더 넓은 범위의 값을 지원할 수 있습니다.이 인수를 생략하면 0으로 처리됩니다.

보고:
지수 표기법을 사용하지 않고 소수점 이하 자릿수가 정확히 자릿수인 숫자의 문자열 표현입니다.필요한 경우 숫자는 반올림되고, 필요한 경우 소수 부분은 지정된 길이를 갖도록 0으로 채워집니다.number가 1e+21보다 큰 경우 이 메서드는 단순히 Number.toString()을 호출하고 지수 표기법으로 문자열을 반환합니다.

예:

>>> new Number(15.236562213541684).toFixed(2);
"15.24"
>>> new Number(9846.65456169846).toFixed(2);
"9846.65"

이 마지막 것은 귀하의 예와 일치하지 않습니다. 9846.65456169846 소수점 이하 두 자리까지 반올림해야 합니다. 9846.65, 아니다 9846.66.

코드가 이 작업에 필요한 것보다 더 복잡합니다.소수점이 소수점 양쪽의 숫자 길이에 관계없이 항상 안정적인 값을 나타낸다는 것을 알고 있다면 운이 좋을 것입니다.

1) 그러면 원래 숫자에 100을 곱하면 됩니다.

2) if (Number(x.charAt(indexOF(".") + 1)) > 4) {x += 1} 여기서 x는 숫자입니다.

3) 파싱인트

4) 100으로 나누면 끝입니다.

고정 소수점 연산을 사용하라는 조언은 좋은 조언입니다.불행하게도 Javascript에는 고정 소수점 연산이 없습니다. 모든 숫자는 배정밀도 부동 소수점 숫자입니다.(음, 명시적인 지원 라이브러리를 가져오지 않고는 고정 소수점 연산이 없습니다.)

텍스트 필드의 입력을 스크러빙하기 위해 숫자를 가능한 한 문자열로 처리하기 시작했습니다.입력을 소수점 왼쪽과 오른쪽 부분으로 자른 다음 (필요한 경우 Math.floor()를 통해) 정수 값으로 작업합니다.소수점 이하 2자리를 넘는 숫자를 처리해야 한다면 오류로 처리하거나(어쨌든 무슨 뜻인가요?) 다시 분리하여 정수로 작업하세요.

만약 당신이 ~ 아니다 사용자 제공 값(예: 텍스트 입력 필드의 항목)을 처리하는 경우 실제로 필요한 숫자 도구가 없기 때문에 Javascript에서 이 작업을 수행해서는 안 됩니다.

교체 Math.round() ~와 함께 Math.ceil() 작동해야합니다 :버그는 다른 곳에 있어야 합니다.

또한, 나는 isNaN(parseInt()) 어쨌든 수학 함수는 숫자로 변환되므로 완전히 반환됩니다. NaN 그게 불가능하다면.이로 인해 함수가 반환됩니다. NaN 또한 부울보다 더 적합합니다. false.

그리고 그런데:금전적 가치와 함께 부동 소수점 수학을 사용하는 것은 좋지 않습니다.대신 고정 소수점 연산을 사용하세요!


이제 우리는 당신이 하려는 일이 무엇인지 알았습니다. 예에 대해 원하는 값을 계산하는 코드는 다음과 같습니다.

var value = 295.30;
var count = 156;
var payment = Math.ceil(value * 100 / count) / 100;
var last_payment = Math.round((value - (count - 1) * payment) * 100) / 100;

바꾸다 round() 에게 ceil() 부동 소수점 값 사용으로 인한 부정확성을 보상하기 위해 마지막 결제를 정상적으로 반올림해야 하므로 모든 계산이 작동하지 않았습니다.

일반적으로 정수 수학만 사용하는 것이 더 낫습니다. 따라서 모든 값에 다음을 곱합니다. 100 값을 출력할 때만 변환합니다.

var value = 29530;
var count = 156;
var payment = Math.ceil(value / count);
// rounding no longer necessary as integer math is precise:
var last_payment = value - (count - 1) * payment;

아니, 당신 말이 맞았습니다.

Ceil modifictaion으로 코드를 테스트했는데 작동합니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top