2014-01-26 5 views
2

필자는 끊임없이 증가하는 분모를 가지고 정확하고 정밀하게 조작하려고하는 데이터를 가지고 있습니다.BigInteger를 나눌 때 스케일을 빼고 곱셈 할 때 왜 더합니까?

분자에는 항상 소수점이 있다고 가정하십시오.

docs에서 divide(BigDecimal divisor)은 소수점 이하 자릿수의 사용법을 이해할 때 실제로 이상하게 보이는 크기를 줄이며, 나눗셈에서 증가해야합니다.

multiply(BigDecimal multiplicand)은 또한 docs에서 볼 수 있습니다. 소수점 이하의 자릿수를 필요로하는 2 승수의 가능성이 줄어들 기 때문에 규모에 대한 내 이해에 따르면 이것은 또한 의미가 없습니다.

문서에 이러한 오타가 있습니까?

그렇지 않은 경우 스케일에 대한 나의 이해가 올바르지 않습니까?

그렇지 않으면 소수점 이하 자릿수가 증가하는 분모가 계속 증가하면서 정밀도를 어떻게 유지할 수 있습니까?

+1

확실하지 당신의 이 목적이 "무한"정밀도를 얻는 것이라면, BigIntegers {numerator, denominator} 쌍을 유지하는 RationalNumber 클래스를 구현할 수 있습니다. 따라서 숫자를 인쇄 할 때만 정보를 잃게됩니다 10 진수 (또는 다른 기본 형식)로 표시됩니다. –

+0

@barakmanos 나는 바락 마노를 사과합니다. 나는 정말로 그 질문이 실제로 무엇인지조차 알지 못했다. 편집하십시오. 미리 감사드립니다. –

답변

2

사실상 scientific notation입니다. 는 문서 말한다 같이, BigDecimal의 값은 다음과 같습니다

unscaledValue × 10^(-scale) 

따라서 두 BigDecimal의를 곱하면 자신의 unscaledValue의 곱과 scale의 추가에 해당합니다 : 내가 이해

a * b 
== (uA * 10^-sA) * (uB * 10^-sB) 
== (uA * uB) * 10^-(sA + sB) 
+0

Oli Charlesworth에게 감사드립니다! 이것은 BigDecimal을위한 것입니다. 심지어 눈금이 나누기와 함께 감소하면, 눈금이 나누기와 함께 감소하고 곱셈과 함께 증가하는 것이 사실이라면 곱셈이 감소하는 동안 'unscaledValue'가 증가합니다. 이해 좀 도와주세요. 대단히 감사드립니다! –

+0

@Gracchus : Ooops, 그건 오타였습니다. 나는 BigDecimal을 의미했다 ... –

+0

@Gracchus : 우리는'a * b == (uA * 10^-sA) * (uB * 10^-sB) == (uA * uB) * 10^- (sA + sB)'. –