Форум: "Прочее";
Текущий архив: 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.01 c