Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2006.05.07;
Скачать: CL | DM;

Вниз

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

 
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;
Скачать: CL | DM;

Наверх




Память: 0.49 MB
Время: 0.009 c
2-1145596469
vegarulez
2006-04-21 09:14
2006.05.07
Про неподключенную БД.


1-1142340852
Sergg
2006-03-14 15:54
2006.05.07
Как разукрасить ветки из TTreeView


2-1145025876
dera
2006-04-14 18:44
2006.05.07
Что неправильно в запросе?


15-1144959563
qazwsx
2006-04-14 00:19
2006.05.07
Правда что Borland забил на Delphi?


2-1145180834
Yastreb
2006-04-16 13:47
2006.05.07
Работа Paradox на ненастроенных машиннах





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский