yanlış java ondalık ve dolayısıyla yanlış hesaplama

Aldığım çıktı şu şekildedir:

number of bags ordered : 43 ($236.50)

discount : 5% ($11.83)

total cost : $224.68

that correct total cost should be 224.67 because 236.50 - 11.83 = 224.67

the discount I got using %.2f shows 11.83 where the original value is 11.825

total cost = bags ordered - discount

224.68 != 236.50 - 11.825 = 224.675

ve sadece bir up-up değeri var ve ben 224.68 ama 224.67 istemiyorum.

236.50-11.83 = 224.67 değil 236.50-11.825 = 224.675 olduğunu nasıl temin ederim?

someone please help me with this ><

teşekkür ederim :)

0
Kodunu göster lütfen.
katma yazar Michael Petrotta, kaynak
.2f, doğru olmayan kayan noktalı aritmetik önerir.
katma yazar Scorpion, kaynak

4 cevap

Para birimi hesaplamaları için kayan nokta sayıları kullanmayın - ondalık sınıfları !

3
katma
Şu anda, benim ders cenneti BigDecimal kadar kapsayacak. Bunu kodum D'de kullanmanın hiçbir fikrim yok: başka herhangi bir fikir?
katma yazar Pei Pei, kaynak
1
katma
şansını kimse BigDecimal bir sınıfa ders olacağını vardır ... Eğer linke sayfadan geçmesi ya da sadece Google eğer bu konuda çok sayıda bilgi ve örnekleri bulacaksınız edin.
katma yazar Gevorg, kaynak
Şu anda, benim ders cenneti BigDecimal kadar kapsayacak. Bunu kodum D'de kullanmanın hiçbir fikrim yok: başka herhangi bir fikir?
katma yazar Pei Pei, kaynak

Kayan nokta aritmetiği, para biriminde olduğu gibi sabit ondalık değerler için kötülüktür. Sadece tamsayıları kullanın ve çıktıyı, . ile ayrılmış 2 haneye sahip olmanız için biçimlendirin, böylece size çok fazla baş ağrısı sağlayacaktır.

Eğer gerçekten yüzmeyi sürdürmek istiyorsanız, yuvarlama ve çarpma/bölme ile bazı hileler yapmanız gerekir.

  • 11.825 * 100 = 1182.5
  • Math.round (1182.5) = 1183
  • 1183/100 = 11,83
0
katma
İkinci olanı kullanarak yapabiliyorum: D ama math.round() benim hecemimde değil =. = Yani BigDecimal. bu yüzden nasıl yapılacağını bilmiyorum ...
katma yazar Pei Pei, kaynak

Başka kütüphane dersleri kullanmanız gerekmediğinden, kendi yuvarlama yönteminizi yine de uygulayabilirsiniz.

public static float round(float val) {
   return (val*100.0 + 0.5)/100.0;
}

Sonraki işlemlerde kullanmadan önce değerlerinizi yuvarlamak.

0
katma
Ancak bu doğru değil. Kayan nokta değerlerinin aslında ondalık basamakları yoktur, bu nedenle sabit sayıda ondalık basamağa yuvarlanmaya veya kesmeye çalışmak bir kimeradır.
katma yazar EJP, kaynak