Ana sayfa / Blog / Mühendislik
MühendislikHesap bölüşmede yuvarlama: uygulama ile tablo neden farklı
Üçe bölünen $100.00'lük bir hesap, bir tablonun düşürdüğü ve Dimesum'un hesabın sabit bir özetiyle (hash) seçilen tek bir kişiye verdiği bir kuruş bırakır. İşte adım adım hesaplanmış tablo, yerine koyduğumuz kural ve yalnızca bir tablonun yapabileceği iki para birimi hatası.
Tablonuz $66.66 diyor, uygulama ise $66.67. O tek kuruş, hesap bölüşmede yuvarlamadır ve Dimesum'u Excel ile karşılaştıran birinden aldığımız en yaygın mesajdır. Kısa yanıt şu: tablo her payı kendi başına yuvarlar ve artan kuruşu kaybeder, Dimesum ise o kuruşu hesabın sabit bir özetiyle (hash) seçilen tek bir kişiye verir, böylece payların toplamı her zaman hesabın toplamına eşit olur.
Sorun, neden ve çözüm, alıntılayabileceğiniz üç cümlede. Üçe bölünen $100.00'lük bir hesap üç eşit tutarla ödenemez, bu yüzden biri $33.34 taşır. Her hücreyi yuvarlayan bir tablo üç kez $33.33 gösterir ve sessizce bir kuruş düşürür; Dimesum ise kuruşu saklar ve onu kimin taşıyacağına hesabın kendi özetiyle karar verir. İkisi eşit bölünen her hesapta anlaşır, eşit bölünmeyen her hesapta ise kişi başına en fazla bir kuruş farklı çıkar.
Belirti: bir tarafta olan, diğer tarafta olmayan bir kuruş
Bu bildirim genellikle hep aynı şekilde gelir. Biri bir aylık hesabı dışa aktarır, bakiyeleri bir tabloda yeniden oluşturur ve birkaç kuruşluk bir uyuşmazlık bulur. İki tarafta da hesap başına bir kuruştan fazla bir şey eksik değildir, yine de kimse ikisini eşleştiremez.
Bir grup bakiyesinin yanlış görünmesinin dört nedenini paylaşılan bakiyeler neden hiç tutmaz yazısında anlattık. Bu yazı bunların ilkini, yuvarlanan kuruşu ele alıyor ve onu bir tabloya kadar izliyor, çünkü dikkatli bir kişi bizi kontrol etmek için oraya gider. Ayrıca bir tablonun ters gittiği ama bir uygulamanın gidemeyeceği iki yeri de ele alıyor: iki para birimini tek bir sütunda toplamak ve yene sahip olmadığı iki ondalık basamağı vermek.
$100.00'lük bir hesap, üçe bölünmüş, bir tabloda ve uygulamada
Emma akşam yemeği için $100.00 ödüyor. Lucas, Sofia ve Emma hesabı eşit bölüyor. Yüz doların üçe bölünmesi $33.333 ve bu sonsuza kadar böyle gider; hiçbir kart bunu ödeyemez.
Bir tablo bu sonsuz sayıyı tutabilir. Üç hücreye =100/3 yazın, onları iki ondalık basamağa biçimlendirin, her biri $33.33 gösterir. TOPLA (SUM) hücresi $100.00 gösterir, çünkü ekrandakileri değil, gizli basamakları toplar. Şimdi bir okuyucu görünen üç hücreyi bir hesap makinesiyle toplar ve $99.99 bulur.
Dikkatli bir tablo ise bunun yerine yuvarlar: her hücreye =ROUND(100/3, 2) yazılır. Artık her hücre gerçekten $33.33 tutar, TOPLA gerçekten $99.99 eder ve kuruş tablodan çıkmış olur. Emma'nın Lucas'tan $33.33 ve Sofia'dan $33.33 alacağı var, bu yüzden tablo ona $66.66 geri döndüğünü söyler. Kendi payının $33.33 olması gerekiyordu, ama kimse bunu yazmadan akşam yemeğinin $33.34'ünü ödemiş oldu.
| Nerede bölündü | Emma'nın payı | Lucas'ın payı | Sofia'nın payı | Payların toplamı | Emma'nın alacağı |
|---|---|---|---|---|---|
| Dimesum, özeti artık kuruşu Emma'ya veren bir hesap | $33.34 | $33.33 | $33.33 | $100.00 | $66.66 |
| Dimesum, özeti artık kuruşu Lucas'a veren bir hesap | $33.33 | $33.34 | $33.33 | $100.00 | $66.67 |
Tablo, iki basamakla gösterilen =100/3 | $33.33 | $33.33 | $33.33 | TOPLA'da $100.00, ekranda $99.99 | Ekranda $66.67 |
Tablo, =ROUND(100/3, 2) | $33.33 | $33.33 | $33.33 | $99.99 | $66.66 |
Her satır, sizin de kendiniz yeniden yapabileceğiniz bir aritmetik.
İkinci Dimesum satırında Lucas $33.34, Sofia da $33.33 borçlu ve $33.34 artı $33.33, $66.67 eder. Yuvarlanmış tabloda $33.33 artı $33.33, $66.66 eder. Bunların ikisi de bir hata değil. Bunlar tek bir kuruş hakkında iki farklı kural ve yalnızca biri kuruşu kayıtta tutuyor.
Her pay neden önce aşağı yuvarlanır
Dimesum, bazı parlamentoların oy oranlarını tam sandalyelere dönüştürmek için kullandığı bir kural olan en büyük kalan yöntemiyle böler. Her tutar, para biriminin en küçük biriminin tam sayısı olarak saklanır, yani $100.00, 10,000 senttir. Her kişinin tam payı bir kesir olarak hesaplanır, ardından herkes bunun altındaki tam sentleri alır: her biri 3,333, toplamda 9,999.
Geriye tek bir sent kalır. Artan sentler, kesirleri en çok kesilen kişilere birer birer dağıtılır. Eşit bir bölüşümde herkesin kesri aynıdır, bir sentin üçte biri, bu yüzden kuralın bir eşitlik bozucuya ihtiyacı vardır. İlk sürümümüzün ters gittiği yer de bu eşitlik bozucuydu.
Bu yöntemin verdiği güvence, bir tablonun hiçbir zaman veremeyeceği güvencedir: paylar toplama tam olarak eşit olur ve hiçbir pay kendi tam değerinden bir sentten fazla uzakta değildir. Aynı aritmetik eşit bir bölüşüm, yüzdeli bir bölüşüm, ağırlıklı paylar, kalemli bir hesabın her satırı ve üzerindeki her vergi ya da bahşiş havuzu için çalışır. Bir hesabı kalem kalem bölen uygulamalar yazımız bunu indirimli, dört kişilik bir akşam yemeğinde gösteriyor.
İlk denediğimiz: her artık kuruşu en eski üye aldı
İlk eşitlik bozucu, akla ilk gelen seçenekti. Üyeler katılma zamanlarına göre sıralanır, bu yüzden eşitlikler en eski üyeye gidiyordu. Belirleyicidir, test edilmesi kolaydır ve tek bir hesapta kimse buna haksız diyemezdi.
Bir yıl boyunca ise bu bir ek ücrettir. Üç kişilik bir ev kirayı, elektriği, interneti ve alışverişi böler ve bu hesapların çoğu bir kuruş artık bırakır. Bu kuruşların her biri aynı kişiye, grubu kuran kişiye gitti. Tek bir kuruş hiçbir şey sayılmaz; ama tek bir yöne giden birkaç yüz kuruş, birinin eninde sonunda bir tabloda fark edeceği bir örüntüdür.
Kurucunun 21 Ağustos 2026'daki yanıtı, bunu rastgele bir katılımcının taşıması gerektiği, böylece birçok hesap boyunca dengeleneceğiydi. Rastgeleliğin bizim için bir püf noktası vardı. Dimesum bir hesabın bölüşümünü her düzenlendiğinde yeniden hesaplar ve bir düzenleme, bir düzenlemenin bölüşümünü neden yeniden belirtmesi gerektiği yazısında anlatıldığı gibi, bölüşümü yeniden belirten yeni bir kayıt olarak saklanır. Gerçek bir rastgele çekilişle, yalnızca hesabın adını değiştiren bir düzenleme bile zarı yeniden atar, kuruşu başka birine taşır ve hiç hareket etmemiş bir para için bir düzeltme kaydederdi.
Çözüm: artık kuruşu hesabın sabit bir özetiyle döndürmek
Böylece rastgele, sözde rastgele ve sabit hale geldi. Her hesabın kendi kimliği var ve biz onu, her makinede ve her derlemede aynı yanıtı veren küçük bir özet işlevi olan FNV-1a ile özetliyoruz. Özet, sıralı listede artan sentlerin dağıtılmaya nereden başlanacağını seçer. Aynı hesap, aynı yanıt, her hesaplandığında; birçok hesap boyunca ise başlangıç noktası her kişiye yaklaşık eşit sıklıkta düşer.
Sıralı liste hâlâ en büyük kalan sırasıdır ve eşitlikler en eski üyeden başlayarak bozulur. Özet yalnızca dağıtımın nereden başlayacağını değiştirir. Eşit, üç yönlü bir bölüşümde bu, her hesabın $33.34'ü taşımak için üç kişiden birini seçmesi ve bu seçimin o hesap için hiçbir zaman değişmemesi demektir.
Tablonuzla uygulamanın farklı hesaplarda farklı şekilde anlaşmamasının nedeni budur. Bir $100.00'lük akşam yemeğinde özet kuruşu Emma'ya verir ve ikisi onun $66.66 alacaklı olduğunda anlaşır. Bir sonrakinde ise kuruşu Lucas'a verir ve uygulama $66.67 der. Her satır için tek bir kuralı olan bir tablo, özeti kopyalamadıkça bunu yeniden üretemez.
Kabul ettiğimiz bedel
İçeriği aynı olan iki hesap artık bir kuruş farklı olabilir. Aynı üç kişiyle yenen iki $100.00'lük akşam yemeği, birinde Emma için, diğerinde Sofia için $33.34 olarak bölünebilir. Bir hesabın paylarını bir başkasınınkiyle karşılaştıran kendi uçtan uca testlerimizden ikisi, bu değişiklik yayına girdiği gün bozuldu; artık bunun yerine kuralın çıktısını kontrol ediyorlar.
Bunun doğru bir takas olduğunu düşünüyoruz. Her bakiyenin altındaki defter yalnızca ekleme yapılan bir defterdir, bu yüzden nedensiz hareket eden bir kuruş sonsuza kadar yazılı kalırdı; tasarım her bölüşümün arkasındaki yalnızca ekleme yapılan defter yazısında. Hesap başına sabit olan ve kişiler arasına yayılan bir kuruş ise hiçbir zaman bir düzeltmeye ihtiyaç duymaz.
Doları euroya ekleyen bir sütun bir toplam değildir
İkinci fark bir kuruştan büyüktür ve her zaman tablonundur. Bir gezide Emma €90'lık bir otel gecesi ve $60'lık bir müze bileti ödüyor ve tablonun en altında bir TOPLA olan tek bir Tutar sütunu var. 150 diyor. Bu sayının para birimi yok, bu yüzden kimse ona borçlu olamaz.
Dimesum her bakiyeyi para birimi başına tutar ve hiçbir zaman para birimleri arasında toplama yapmaz. Grup euro olarak ne kadar borçlu olunduğunu ve ayrıca dolar olarak ne kadar borçlu olunduğunu görür. Grup bir kurda anlaşırsa, Dimesum bakiyeleri o kurla etiketlenmiş olarak tek bir para birimine katlanmış gösterebilir; borcun kendisi ise harcandığı para biriminde kalır.
Aksini yapmaktan doğan hatalar ikinci bir para biriminin yol açtığı para hataları yazısında. Karşılaştırma yapmanızın nedeni bir geziyse, çok para birimli masraf bölüşme uygulamaları yazısı diğer uygulamaların ikinci bir para birimini nasıl tuttuğunu yan yana koyuyor.
Katlamak, kendine ait bir yuvarlamayı geri getirir. Bir çevirme sıfırdan uzağa doğru yarım yuvarlamayla tam sentlere yuvarlanır, bu yüzden yen olarak toplamı sıfır olan bakiyelerin dolar olarak toplamı bir sent fazla olabilir. Her çevirme için en fazla bir en küçük birimi, en düşük üye kimliğine sahip kişinin üstlenmesine izin veriyoruz; bunun ötesinde hesaplaşma planı reddedilir. Sessizce $1 yanlış olan bir plan bir hatadan daha kötüdür, çünkü biri onu öderdi.
Yenin kuruşu yoktur, bir tablo ise ona yine de iki tane verir
Üçüncü fark, Japonya'ya yapılan her gezide ortaya çıkar. Yenin bir alt birimi yoktur: ISO 4217 para birimi standardındaki üssü sıfırdır, bu yüzden ¥1 herkesin ödeyebileceği en küçük tutardır. Dimesum'da üçe bölünen ¥10,000'lik bir akşam yemeği ¥3,334, ¥3,333 ve ¥3,333 olarak çıkar ve toplamı ¥10,000 eder.
Para için biçimlendirilmiş bir tablo üç kez ¥3,333.33 gösterir; bu, hiçbir madeni paranın ödeyemeyeceği bir rakamdır. Onu tam yene yuvarlayın, üç kez ¥3,333 gösterir ve toplamı ¥9,999 eder. Yen, doların bir sent kaybettiği gibi bir birim kaybeder.
Bunu düzeltmeden önce biz de kendi kodumuzda bozduk.
Bir metin satırından bir tutar okuyan kod, bir zamanlar onu 100 ile çarparak alt birimlere çeviriyordu; bu dolar ve euro için doğru, yen için yanlıştır: ¥2,000'lik bir taksi ¥200,000 oldu. Bu 100 katlık bir hataydı ve hiçbir yuvarlama kuralı onu yakalayamazdı.
Çevirme artık her para biriminin üssünü ISO tablosundan okuyor ve bir para biriminin en küçük biriminden daha ince bir rakam yuvarlanmak yerine reddediliyor. Metinden tutar okumanın bizimle daha uzun bir geçmişi var ve bu geçmiş masraf ayrıştırıcımızı neden sildiğimiz yazısında anlatılıyor. Yenle yapılan bir gezinin bu sorun olmadan nasıl bölündüğü ise Japonya'daki hesap bölüşme uygulamaları yazısında.
Bir tablonun paraya yaptığı başka şeyler
Excel sayıları ikili kayan noktalı biçimde saklar ve bazı ondalık sayıların tam bir ikili karşılığı yoktur. Microsoft'un Excel'de kayan nokta aritmetiği hakkındaki kendi notu, bir toplamın neden beklediğiniz rakamdan çok az farklı çıkabileceğini açıklıyor. Çoğu zaman ekran bunu gizler ve gördüğünüz hücre ile topladığınız değerin farklı olabilmesinin nedeni de tam olarak budur.
Yuvarlama işlevlerinin de kendi kuralları var. Excel'in YUVARLA (ROUND) işlevi ve Google E-Tablolar'daki ROUND her hücreyi, bölüşümdeki diğer hücreler hakkında hiçbir bilgisi olmadan, kendi başına yuvarlar. Farkın tamamı budur: bir bölüşümün, paylar yine de hesabın toplamına eşit olsun diye, payları birlikte yuvarlaması gerekir.
Dimesum parayı hiçbir zaman bir birimin kesri olarak saklamaz. Her tutar, yanında para birimi yazılı olarak tam bir sent ya da yen sayısıdır ve her bölüşüm kendi toplamını tam olarak korur. Grubun parasını yine de bir tabloda tutmayı tercih ederseniz, ortak masraf takip şablonumuz adil bir başlangıçtır, ortak masraflar için tablo mu, uygulama mı yazısı da tablonun nerede yetersiz kalmaya başladığını ele alıyor.
Tablonuzu uygulamayla nasıl uyumlu hale getirirsiniz
Dimesum'un rakamlarını kendiniz, elle yeniden üretebilirsiniz. Her zaman tam sentlerle çalışın. Her kişiye tam payının altındaki tam sentleri verin, kalan sentleri sayın ve onları birer birer dağıtın.
- Hesabı sente çevirin: $100.00, 10,000 eder.
- Her kişiye tam payının tabanını verin: her biri 3,333, toplamda 9,999.
- Artan senti uygulamanın onu taşıdığını gösterdiği kişiye verin ve payların toplamının 10,000 ettiğini kontrol edin.
- Her para birimi için bir tablo tutun ve ikisi arasında hiçbir zaman bir TOPLA koymayın.
Üçüncü adım, hesabın özeti olmadan tahmin edemeyeceğiniz tek adımdır, bu yüzden onu hesaptan okuyun. Ağırlıklar ve yüzdelerle birlikte herhangi bir bölüşüm için daha uzun aritmetik masraf bölüşme hesaplayıcısı yöntemi yazısında, aynı kontrolün bir grubun tüm geçmişine uygulanmış hali de bir gezide kimin kime borçlu olduğunu nasıl takip edersiniz yazısında.
Bunun hâlâ yapamadığı şey
Tablonuzla uygulamanın her hesapta çaba harcamadan anlaşmasını sağlayamaz. Sütun başına tek bir yuvarlama kuralı olan bir tablo, kalan bırakan hemen her hesapta Dimesum'dan bir kuruş farklı çıkar ve kuruşu taşıyan kişi hesaptan hesaba değişir. Bu da tam olarak kuralın işlediğini gösterir.
Katlanmış bir toplamı da tam olarak doğru yapamaz. Kararlaştırılmış bir kurla tek bir para biriminde gösterilen bir bakiye yol göstericidir ve ondan oluşturulan hesaplaşma planı, her çevirme için bir en küçük birim kadar farklı olabilir. Önemli olan borç, harcandığı para biriminde kalır; bir grubun hesaplaşmasının her seferinde tek bir para birimiyle yapılmasının nedeni de budur.
Her hücreyi değil, toplamı kontrol edin
Uygulama ile tablonuz bir kuruş farklı çıktığında, hesaptaki payları toplayın: toplama eşitlerse, kuruş bilerek tek bir kişidedir. Hangi kişide olduğunu görmek için Dimesum'u açın, hesaba dokunun ve diğerlerinden bir kuruş daha büyük olan payı okuyun.
Sık sorulan sorular
Hesap bölüşme uygulamam neden Excel'den bir kuruş farklı?
Çünkü Excel her payı kendi başına yuvarlar, uygulama ise payları birlikte yuvarlar. Üçe bölünen $100.00'lük bir hesap, yuvarlanmış bir tabloda üç kez $33.33'tür ve toplamı $99.99 eder. Dimesum bir kişiye $33.34 verir, böylece payların toplamı $100.00 eder ve o kuruşu kimin taşıyacağına hesabın sabit bir özeti (hash) karar verir.
Bir hesap üçe bölündüğünde fazladan kuruşu kim öder?
Tek bir kişi öder ve Dimesum'da hangisinin ödeyeceğine hesabın kendi özeti karar verir. Paylar en büyük kalan yöntemiyle hesaplanır ve artan kuruşların dağıtılmaya başlandığı yer, hesabın sabit bir özetiyle döndürülür. Aynı hesap her zaman aynı yanıtı verir ve birçok hesap boyunca kuruş her kişiye yaklaşık eşit sıklıkta düşer.
Dimesum artık kuruş için neden rastgele bir kişi seçmiyor?
Çünkü gerçek bir rastgele çekiliş, bir hesap her düzenlendiğinde kuruşu yerinden oynatırdı. Dimesum her düzenlemede bölüşümü yeniden belirtir, bu yüzden yeni bir çekiliş, hiç hareket etmemiş bir para için bir düzeltme kaydederdi. Hesabın sabit bir özeti, birçok hesap boyunca rastgele bir seçim gibi davranır ve tek bir hesap için her seferinde aynı yanıtı verir.
İki para birimindeki bakiyeleri tek bir tablo sütununda toplayabilir miyim?
Hayır, toplamın hiçbir anlamı olmaz. 150 olarak toplanan €90 ve $60, para birimi olmayan bir sayıdır, bu yüzden kimse onu borçlanamaz. Dimesum para birimi başına bir bakiye tutar ve hiçbir zaman para birimleri arasında toplama yapmaz; bir grup onları kararlaştırdığı bir kurla, o kurla etiketlenmiş olarak tek tutara katlanmış görebilir, her borç ise harcandığı para biriminde kalır.
Kuruş olmadığında Dimesum yen tutarlarını nasıl böler?
Tam yen olarak, çünkü yenin en küçük birimi ¥1'dir. Üçe bölünen ¥10,000'lik bir akşam yemeği ¥3,334, ¥3,333 ve ¥3,333 olur ve toplamı ¥10,000 eder. İki ondalık basamakla biçimlendirilmiş bir tablo hiçbir madeni paranın ödeyemeyeceği ¥3,333.33 gösterir ve her hücreyi tam yene yuvarlamak, bir dolar tablosunun bir kuruş kaybettiği gibi ¥1 kaybettirir.
Popüler yazılar
- Hesaplaşma: grup harcamalarını daha az transferle kapatın4 dakika okuma
- Masrafı düzenlemek bölüşümü neden yeniden belirtmeli7 dakika okuma
- Çok para birimli giderlerde altı para hatası8 dakika okuma
- En iyi hesap bölüşme uygulamaları: 11 sıralı liste11 dakika okuma
- Bakiyeleri tam tutan salt ekleme defteri7 dakika okuma