E-ticaret sitesi için Döviz Dönüşüm - yuvarlama nedeniyle yanlış Toplam Cart Önlenmesi

4 Cevap php

Ben bir e-ticaret uygulaması için çoklu para birimi desteği ekliyorum. Ben sorunu yaklaştı yolu taban para uygulama tutmak ve şablon bir fiyatı gösteren bir priceDisplay () fonksiyonu / eklenti her zaman aramak sahip oldu. Yani şablon dolar tutarları fiyatları almaya devam ediyor. PriceDisplay işlevi doğru gerekirse fiyatını dönüştürür ve oturumda saklanan izleyiciler ayarlarına bağlı olarak doğru $ veya Euro işareti ekler. Sipariş teslim üzerine, başvuru dolar miktarı yanı sıra currencyCode ve currencyRate sırasını saklar. Ayrıca biz onlar sipariş ekranda gösterildi tam olarak ne fatura almak sağlamak için kendi para müşterinin kredi kartı tahsil edilecektir.

Çıkış sırasında yanı sıra sepeti sepeti toplamları görüntülenirken Şimdi ben yaşıyorum konudur. Örnek olarak, uygulama fiyatları alışveriş sepeti görüntülemek için şablon gönderir:

subtotal: 9.75
ship: 5.95
total: 15.70

Şablon bu miktarda alır ve her öğe üzerinde priceDisplay işlevini çağırır. Döviz kuru 1.1 ise, o zaman biz kullanıcıya görüntülenen olsun:

subtotal: 10.725 -> 10.73
ship: 6.545 -> 6.55
total: 17.27

Bunu subtotal + gemi = 17.28 görebilirsiniz, ancak dönüştürülen toplam 17.27 olduğunu.

Yani bence seçeneklerin çift tüm yol boyunca düşünce olmasa, işe yarayabilir:

  1. Uygulama tarafında tüm dönüşüm Kolu
  2. Ürün ulaştı edileceği durumlarda, şablon onları dönüştürmek ve sağlayacak priceDisplay işlevi, temel para birimi birlikte tüm bireysel addends ve toplam göndermek gerektiğini converted total ve sum of addends maç kadar. Bu durumda, o nasıl toplam 15.70 ama belki 15.71 veya 15.69 değil uygulamaya iletişim yapmak (biz baz para düzeni saklanması ve ödeme işlerken exchangeRate çarpın olacak çünkü.)
  3. Dönüşümlerin parçası olarak düştü / eklenen ondalık noktaları takip edin ve o ile 'akıllı' bir şey yapmak. Yani bu örnekte, 10.725, biz 5/1000 ekledi. Biz 6,545 dönüştürmek Peki, ne zaman biz ilk daha sonra dönüştürmek 0,005 damla gerekir. Belki de bu seçenek 2 yukarıdaki yaptığı süreçtir?
  4. Burada öneri.

Herhangi bir fark yaparsa, uygulama PHP ve şablon Smarty olduğunu.

You can also see the same issue in adding the line totals of the cart items:
3 items x 9.75 each = 29.25
converted:
3 items x 10.73 (10.725) = 32.18 (32.175)
but 3 x 10.73 = 32.19 != 32.18

4 Cevap

Ben sıkıca 1 kampta değilim. Para birimi dönüştürme temel iş mantığı, ve modelleri, değil görünümleri aittir.

Para kayan noktalı sayılar gibi görünüyor, ancak Dahası, öyle değil. Para senin temel birimi ne olursa olsun tamsayı miktarlarda el değiştirir. Gumballs 10 sent her biri ve ben on satın alırsanız ABD'de, örneğin, sonra ben 10 gumballs için 100 kuruş ticaret değilim. Ben bir dolar fatura vermek bile, bir yazılım açısından, 100 kuruşa kadar olduğunu saymak için en iyisidir.

Bu konuda daha fazla bilgi için, Martin Fowler "Patterns of Enterprise Application Architecture" ve "Analysis Patterns" bkz. O, ayrıntılı olarak tüm konularda konuşur ve iyi örnek kodu verir. Ayrıca web üzerinde bu bilgi bazı bulabilirsiniz:

  • Quantity (bazı para örnek kodla)
  • Money (başta bir kitabında içine işaretçi)

Eğer çalışmak muhasebe gerekiyorsa, ben de muhasebeci konuşmak istiyorum. Para birimi dönüştürme sık sık değişen oranları, garip ücretleri ve diğer saçmalıklar ile komplike, ve sizden doğru alamadım eğer kitap denge yapmak için pennies kovalayan uzun bir zaman geçirebilirsiniz olsun-go.

Eğer dönüştürülen para birimine dayalı fatura iseniz, gerçekten mantığa bu hesaplama yapıyor olmamalıdır.

Peki şahsen, ben sadece toplam tutarı yapacak, alt toplam gemi miktar eklenir. Bu tabii ki kullanmak için basit yöntem, ve kimse ekstra kuruş özleyeceğim.

Hiç para için kayan nokta sayıları kullanmayın! Sen iyi bir neden için yuvarlama ile acı bir dünyada kendinizi izin vardır. PHP tamsayılar ile tüm para hesaplamalar yapmak, bir ondalık sabit nokta türü yok beri. William'ın bağlantılarına bakın.