말하자면, 어떤 정수 n이 있고 어떤 비율에 따라 두 개의 다른 정수로 나누고 싶습니다. 나는 그것이 작동하는지 아닌지 스스로에게 묻는 접근법을 가지고있다.비율에 따라 두 개의 정수를 분배합니다.
예 : 비율 70 인 20은 14,6으로 세분해야합니다.
확실한 해결책은 다음과 같습니다
이int n = 20;
double ratio = .7;
int n1 = static_cast<int>(n * ratio);
int n2 = static_cast<int>(n * (1 - ratio));
캐스트는 항상 floor
들 때문에,하지만, 난 보통 내 결과를 과소 평가. std::round
을 사용하는 경우 여전히 작동하지 않는 경우가 있습니다. 예를 들어, 소수 첫째 자리가 5 인 경우 두 숫자는 반올림됩니다.
일부 동료는 다음과 같이 제안했습니다. Ceil은 첫 번째 숫자이고 Floor는 두 번째 숫자입니다. 그러나 대부분의 테스트에서 다음과 같이 작동합니다.
1) 자연스럽게 발생하는 회계상의 반올림 오류를 실제로 처리합니까? 내가 생각하는 것 : 20 * .7은 14 일 수 있지만 20 * .3은 5.999999 일 수 있습니다. 그래서, 내 합계는 14 + 5 = 19 일 수도 있습니다. 그러나 이것은 단지 내 추측이지만 이러한 종류의 결과가 발생할 수 있는지 여부는 알 수 없습니다. 그렇지 않으면 이러한 종류의 반올림 제안이 효과가 없을 것입니다.
2) 작동하더라도 ... 왜?
(난 그냥 n 개의 * 비율로 1 위를 계산하고 n으로 숫자 2를 계산할 수 염두에두고 - N * 비율,하지만 난 아직이 질문에 대한 답에 관심이있을 것입니다)
왜 'n1 + n2 == n'이라면 반올림 한 다음에 간단히 덧셈/뺄셈을하고, 필요하다면 하나를 더하거나 뺍니다. – user463035818
부동 소수점 - 정수 변환은 'ceil'이 아니고'floor '입니다. –
당신은 어떤 종류의 반올림 조합이 작동하지 않는다는 것을 증명하는 예제. 그리고 당신은 뺄셈 방법이 효과가 있다는 것을 압니다. 그래서 당신의 질문은 무엇입니까? – michalsrb