Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Прочее";
Текущий архив: 2006.05.07;
Скачать: [xml.tar.bz2];

Вниз

Какое число дает ошибку при математическом округлении ?   Найти похожие ветки 

 
ANB ©   (2006-04-14 09:28) [0]

Надо работать с бухгалтерскими данными и правильно округлять числа.
Помню, что была такая проблема, надо бы ее решить, а на каких числах вылезает - забыл. Сейчас не могу воспроизвести ошибку.


 
MBo ©   (2006-04-14 09:30) [1]

Round по умолчанию использует банковские правила округления - X.5 округляется к ближайшему четному числу.


 
Rouse_ ©   (2006-04-14 10:51) [2]

Везет тому у кого банковское используется, у нас нужно чуть по другому, в случае положительного - банковское округление, в случае отрицательного, Х.6 идет уменьшение...

Вот и приходиться выкручиваться такими констукциями...

@@int:  // целочисленное округление
       sub     esp,$04
       fnstcw  word ptr [esp+$02]
       fnstcw  word ptr [esp]
       or      word ptr [esp],$0F00
       fldcw   word ptr [esp]
       frndint
       wait
       fldcw   word ptr [esp+$02]
       add     esp,$04
       ret

@@round: // банковское округление
       sub     esp,$04
       fistp   dword ptr [esp]
       fild    dword ptr [esp]
       add     esp,$04
       ret


 
ANB ©   (2006-04-14 12:20) [3]


> Round по умолчанию использует банковские правила округления
> - X.5 округляется к ближайшему четному числу.

Это как ?
т.е. round(2.5) = 2 ???

Не, ошибка была в другом. XXXXX.49 округлялось в большую сторону. Но при определенном значении XXXXX.

Мне бы эту ошибку достать.


 
McSimm ©   (2006-04-14 12:21) [4]


> XXXXX.49 округлялось в большую сторону. Но при определенном
> значении XXXXX.


double ?


 
Суслик ©   (2006-04-14 12:33) [5]

Если не ошибаюсь в российской бухгалтерии используется то округление, которому учили в школе

2.1 -> 2
3.1 -> 3
3.8 -> 4

и т.д.


 
McSimm ©   (2006-04-14 12:50) [6]


> используется то округление, которому учили в школе

Только функцию round() этому не учили в школе :)
Да и сами процессоры Intell учились иначе.

Поэтому, чтобы округлять так, как принято, приходится писать собственные функции.

Речь о 2.5 и 3.5.
первое округляется вниз, второе вверх.

Потому что математическое округление строго говоря имеет предпочтение к округлению вверх, (вверх округляется большая часть единичного отрезка, вниз - меньшая)
а банковское статистически позволяет округлять более равномерно. (то так, то эдак :)


 
Ketmar ©   (2006-04-14 13:02) [7]

эх, давно это было, но, насколько я помню, режим округрения можно менять. команды забыл %-(


 
ANB ©   (2006-04-14 13:55) [8]


> McSimm ©   (14.04.06 12:21) [4]

И на double и на Extended. Ошибка эта у меня даже в Clipper проявлялась.


 
McSimm ©   (2006-04-14 14:09) [9]

сталкивался, но подробности очень смутно
Или когда использовался тип double и передавался в функция, ожидающую extended (при этом преобразовании происходило искажение)
Или когда игрался с флагами плавающей точки процессора, включался какой-то режим пониженной точности. (тогда возможно и с extended такое было)


 
oldman ©   (2006-04-14 16:09) [10]


> Какое число дает ошибку при математическом округлении ?


Любое!!!
результат минус число равно ошибка!!!


 
Vlad433 ©   (2006-04-14 16:11) [11]

function Roun(Value: extended; Precision: Integer): extended;
const K10 : array [0..10] of Double = (1,10,100,1000,10000,100000,
 1000000,10000000,100000000,1000000000,10000000000);
begin
Result:=Round(Value * K10[Precision] + 1/K10[Precision+1])/K10[Precision];


 
Gero ©   (2006-04-14 16:12) [12]

> результат минус число равно ошибка!!!

Погрешность, а не ошибка.


 
ferr ©   (2006-04-14 16:22) [13]

var
 a : single;
begin
 a:=2.5;
 writeln(round(a)); // 2
end.
так как 2.5 = 2.499..998


 
McSimm ©   (2006-04-14 16:24) [14]


> ferr ©   (14.04.06 16:22) [13]

round(2.5) и должен давать 2
а 3.5 - 4


 
Alexander Panov ©   (2006-04-14 16:38) [15]

function MyRound(X:Double; N: Integer): Double;
var
 i,n1: Integer;
begin
 Result := X;
 n1 := 1;
 for i := 1 to N do n1 := n1*10;
 result := Trunc(Result*n1+0.50000000000001)/n1;
end;


 
MBo ©   (2006-04-14 16:39) [16]

>так как 2.5 = 2.499..998
Нет, 2.5 имеет точное представление


 
Vlad ©   (2006-04-14 17:02) [17]


> Alexander Panov ©   (14.04.06 16:38) [15]


MyRound(-3.5, 0) дает -2 :-)


 
ferr ©   (2006-04-14 17:09) [18]

неподумавши написал...
нельзя так поступать! :-) сорри


 
vecna ©   (2006-04-14 17:42) [19]

в калькуляторе:
0.005 * 6347 = 31.735

в дельфях
0.005 * 6347 = 31.734999999999 и.т.д.

если не чего не путаю...



Страницы: 1 вся ветка

Форум: "Прочее";
Текущий архив: 2006.05.07;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.49 MB
Время: 0.012 c
2-1145114827
User_OKA
2006-04-15 19:27
2006.05.07
Динамические массивы типа запись


2-1144911447
Sw
2006-04-13 10:57
2006.05.07
Подтверждение удаления


15-1144819407
ps123
2006-04-12 09:23
2006.05.07
Делал ли кто-нибудь на Дельфи аналог ERWin?


2-1145549181
Vitalik__
2006-04-20 20:06
2006.05.07
координаты курсора мыши


2-1145605287
adim
2006-04-21 11:41
2006.05.07
SQL





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский