Главная страница
    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.01 c
4-1139825664
Цукор5
2006-02-13 13:14
2006.05.07
SendMessage при разных вызовах форм


9-1129465753
!Trinix
2005-10-16 16:29
2006.05.07
Нужны кости


15-1144983843
Sergey Masloff
2006-04-14 07:04
2006.05.07
А у Саши Rouse_(с) не днюха ли сегодня? ;-)


8-1134255414
Jrek
2005-12-11 01:56
2006.05.07
stream или channels


15-1145202536
Handle
2006-04-16 19:48
2006.05.07
Что такое сабж





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