Главная страница
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.51 MB
Время: 0.043 c
15-1144923413
Бугага
2006-04-13 14:16
2006.05.07
Работа с Карт Ридером


2-1145349649
Белый Орёл
2006-04-18 12:40
2006.05.07
Сортировка по алфавиту


15-1144908648
Ega23
2006-04-13 10:10
2006.05.07
С Днём рождения! 13 апреля


11-1125985318
DmiSb
2005-09-06 09:41
2006.05.07
Применение KOLxBase ?


2-1145195628
Замок
2006-04-16 17:53
2006.05.07
как програмно расшарить папку