Back to site
Since 2004, our University project has become the Internet's most widespread web hosting directory. Here we like to talk a lot about web development, networking and server security. It is, after all, our expertise. To make things better we've launched this science section with the free access to educational resources and important scientific material translated to different languages.

Рэзкая крытыка ў дачыненні да выкарыстання плавае кропкай тыпаў для прадстаўлення грашовых велічынь

Арыгинальны аутар - David Arnow, Brooklyn College, USA

"... Цар быў у яго кантору, лічачы свае грошы,
Каралева была ў гасцінай, ёсць хлеб і мёд.... "
- Ад дзіцячай песні
Праблема вызначэння класа на канчатковае ўключана кошт членаў, што
прадстаўлена колькасць грошай. У адказ ключ, які выкарыстоўваецца тып быў "двайны".

Я быў абураны, што і відавочнай верагоднасць таго, што многія
інструктараў выбраць для студэнтаў прадстаўляюць грашовыя сумы з
двайны тып - па-відаць, таму што здаецца, як просты спосаб
прадстаўляць цэнтаў частка даляраў і-цэнтаў.

Дазвольце мне сказаць гэта, як далікатна, як я магу, выкарыстоўваючы ўсе дыпламатыі
што я вядомая:

	This is wrong, Wrong, WRONG, ***W*R*O*N*G***.
Перш за ўсё, двухмесныя і яе маленькі паплавок Sidekick ніколі не былі прызначаныя для выкарыстання ў колькасцях, якія ўключаюць ПАДЛІК. Яны прызначаныя для велічынь, якія выцякаюць з вымярэнняў і, такім чынам, па сваёй прыродзе і набліжэнняў, звязаных з пэўнымі дакладнасці. Грошы не вымяраецца. Гэта лічыцца. Вось чаму людзі на пярэдняй лініі кіравання капіталам называюць бухгалтарамі. Цэлыя лікі для падліку. Вось чаму яны істотна падпісаныя версіі падліку нумары, нумары так званы, таму што, ну, яны для падліку. Крыніцай блытаніны ў тым, што пракляты дзесятковай кропкі і дзве лічбы, якія выходзяць за яе межы, якія прадстаўляюць цэнтаў. Давай пагуляем у арфы музыкі і вярнуцца назад, назад у туманны туманы розны час (але той жа галактыкі)..... Даўным-даўно, яшчэ калі моладзь у гэтым аддзеле былі ў пялёнках, мы выкарыстоўвалі вельмі цывілізаваным мове завецца PL / I. Гэта было яшчэ да адкрыцця тыпаў - у тыя дні (разумею, гэта эпоха Джэральд Форд, younguns) мы атрыбутаў. Сярод гэтых атрыбутаў былі

	FLOAT(n)		/* n digits of precision */
  and
	FIXED DECIMAL(n,m)	/* n digits total, m after the decimal point */
Sheee-ён. Мы нават кампутары, якія дзесятковай арыфметыкі інструкцыі. Ну, тады, калі вы павінны былі прадстаўляць грошы, як заробкі вы можаце выкарыстоўваць атрыбуты, як

	FIXED DECIMAL(7,2)
ці, для, скажам, дзяржаўнага доўгу,
	FIXED DECIMAL(15,2)
Затым з'явіліся ў 8080 годзе набор інструкцый і нізкаўзроўневыя мовы, як C і ўсе тыя атрыбуты, пайшлі па шляху дыскатэкі, вольны час касцюмы, і прэзідэнты арахісавага фермера. І вось мы, трыццаць гадоў праз, цікава, як карта FIXED DECIMAL (15,2) на C + + прымітыўных тыпаў. Так, ёсць дзесятковая кропка. Але двайныя / паплавок не адказ. Ёсць фактычна два магчымых адказу: а) выкарыстанне Int і лічыць свае капейкі - так, Пені захаваны зарабіў ні капейкі, і калі вам трэба раздрукаваць некалькі прыемныя воку RC-Граф капейкі проста напісаць:

		cout << "$" << (x/100) << "." << (x%100<10?"0":"") << x%100;
	  Брудна? Так. Але калі вам не падабаецца гэта, падпісаць петыцыю, каб вярнуць PL / I на http://www.bringbackpl1.org/ Гэта добры выкарыстанне умоўнага выразы, хоць, не ці так? б) выкарыстоўваць беднасці C + + S прымітыўных тыпаў і выкарыстоўваць гэта як выдатную магчымасць прадставіць выдатны прыклад для вызначэння класа - вызначыць якасць класа (як многія іншыя зрабілі да вас) У заключэнне я хацеў гэтую тыраду (Хто-небудзь яшчэ з мяне сюды?) з ілюстрацыяй таго, чаму як Біл Гейтс і Уоррен Баффет будзе узрушаны, пазнаўшы, што некаторыя ў Бруклінскі каледж выкарыстоўваць двайныя для прадстаўлення грошай. Ніжэй прыводзіцца праграма, якая пачынаецца з колькасці прыкладна роўныя іх вядомых варта (прынамсі да цяперашняга крызісу), і дадае $ 100 - адзін цэнт за адзін раз - на гэтую велічыню. Аказваецца, што ёсць 0,1% памылкі. Божа, 0,1% ад $ 500 млн складае $ 500.000. Не зусім да Мэдоффа стандартаў, але я сумняваюся, што Гейтс "шведскі стол" ці хацеў бы любы з іх кіраўнікоў грошы, каб мець памылкі, як, што. Зараз, калі ласка, перш чым вы барацьбе з абаронай, што двайныя будзе рабіць толькі штрафам з мамай-і поп-крама бухгалтарскага ўліку, дазвольце мне нагадаць вам, што нават невялікае разыходжанне можа адправіць бухгалтараў у хваляванне (рэчы, як мяркуецца, баланс вы ведаеце) і Акрамя таго, прыклад ніжэй быў толькі адзін я выпадкова пабудаваць - там цалкам можа быць аналагічнымі ці горш, тыя, з удзелам менш стратосферном даляра. Справа ў тым, з дапамогай двайных ў такога роду заяву з'яўляецца няўстойлівым і недарэчным і не трэба вучыць. - Дэвід А.
	  
------------------------------------------------------------------------------

LINUX> cat b2.cpp
#include 
#include 
using namespace std;

int main() {
	double	initialBalance,runningBalance,amountAdded;

	// Warren's or Bill's worth: 500,000,000,000.00: half a trillion dollars and one cent

	initialBalance = 500000000000.01; // 500,000,000,000.01: half a trillion dollars and one cent
	runningBalance = initialBalance;

	for (int i=0; i<10000; i++) {	// add ten thousand pennies ($100)
		runningBalance+=0.01;
		amountAdded+=0.01;
	}

	cout << endl << endl;
	cout << "  initialBalance=" << setprecision(15) << initialBalance << " (original)" << endl;
	cout << "  runningBalance=" << setprecision(14) << runningBalance << " (after adding)" << endl << endl;

	cout << "runningBalance-initialBalance=" << setprecision(5) << left <<  (runningBalance-initialBalance) << " (difference after adding)"<< endl;
	cout << "                  amountAdded=" << setprecision(8) << amountAdded << " (independent sum of what was added)"<< endl << endl;

	double discrepancy= (runningBalance-initialBalance)-amountAdded;
	cout << "  discrepancy=" << setprecision(1) << discrepancy << endl;
	cout << " %discrepancy=" << setprecision(1) << 100.0*discrepancy/amountAdded << endl;

	return 0;
}
LINUX> a.out


 initialBalance=500000000000.01 (original)
 runningBalance=500000000100.11 (after adding)

runningBalance-initialBalance=100.1 (difference after adding)
                 amountAdded=100 (independent sum of what was added)

 discrepancy=0.1
%discrepancy=0.1
LINUX>
Published (Last edited): 08-04-2011 , source: http://www.sci.brooklyn.cuny.edu/~arnow/diatribe.html