Mam następujący podwójne obliczenia w Java:Java kalkulacja precyzja podwójna przegrana
double C1 = some value; // It's always an integer
double C2 = some value; // It's always integer, and C2 >= C1
double S = some value; // It's always 0 < S <= 1
double carry = some value; // It's always 0 <= carry < 1
double rate = ((C1/C2)/S);
double C3 = Math.floor((rate * S * C2) + carry);
Teraz, jeśli nie tracą precyzję, C3 == C1
byłoby prawdziwe. Ale ponieważ tracimy precyzję, czy C3
i C1
wciąż będą równe?
Jeśli one nie zawsze będzie równe, jeśli mam C1
, C2
, S
i C3
, jak mogę zmodyfikować rate
aby upewnić po obliczeniu C3
byłaby równa C1
?
Uwaga: niestety użycie opcji BigDecimal nie jest opcją.
Jeśli chcesz zachować precyzję, użyj "BigDecimal". – SomeJavaGuy
Niestety użycie BigDecimal nie jest opcją, ponieważ tempo jest już zapisane po utracie precyzji i nie mogę nic z tym zrobić. – user1819676
@KevinEsche BigDecimal zapobiega tylko utracie precyzji, jeśli liczby są reprezentowane jako ułamkowe części dziesiętne. Rozważmy przypadek C1 = 1, C2 = 1, S = 0.3 –