Деление

NickProstoNick

Статус как статус :)
Lotus Team
22.08.2008
1 851
27
BIT
0
Всем привет!
Нужна помошь по математике :wacko:
Нужно делить дробные числа. Максимальное число деления - 10
Для начала делить на равные части. С точностью до 2-х знаков. но потом при изменении любого элемента массива должно влечь за собой изменение следующих за ним.

Я пытаюсь сделать расчет в долях.
Например 51.65 (s) на разделить на 7 (n). Исходное значение беру за единицу и получаю массив ( mas(i) ) где каждый элеменит до n-1 равен 0.14, а n-тый равен s - (сумма mas(i) от 1 до n-1). Ну а в итоге каждый элемент mas(i) * s с округлением до 2-х знаков

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

Помогите плиз. как правильно считать?
 

Medevic

Что это ? :)
Green Team
10.12.2004
3 334
1
BIT
6
Лично я мало что понял. И совсем не понял зачем это. :wacko:
 
K

K-Fire

Хранить в полях (или в переменных) числа без округления, сумма будет считаться нормально. А отображать пользователям в округленном виде до 2х знаков.
 

Murtas

Green Team
11.04.2006
137
1
BIT
5
NickProstoNick я тоже особо не понял задачку, но точно знаю что функция округления лотуса НЕ ПРАВИЛЬНО работает - точнее по своим правилам, поэтому могу предложить для округление вот такое к примеру:

Код:
Function RSRound(number As Double, places As Integer) As Double

Dim factor As Double	
factor = 10 ^ places
RSRound = Sgn(number) * Fix( Abs(number) * factor + 0.5) / factor

End Function
 

NickProstoNick

Статус как статус :)
Lotus Team
22.08.2008
1 851
27
BIT
0
K-Fire
Всю математику делаю с массивами. Поля толко для отображения и ввода данных
 
O

Omh

целая пачка.
Лотус использует округление, где 5-ка округляется в большую или меньшую сторону в зависимости от её позиции после запятой (чётная/нечётная).
Кстати, раньше учили округлять именно так (читал книжку по математике 60-ых годов), а в современной школе 5-ка почему то всегда округляется в бОльшую сторону, что при большом кол-ве округляемых чисел даст бОльшую погрешность, чем лотусное округление.
А NickProstoNick, судя по всему, делает разбивку полной суммы на несколько, скажем так, товаров :wacko:
 

NickProstoNick

Статус как статус :)
Lotus Team
22.08.2008
1 851
27
BIT
0
Murtas
Ну а задача проста. Поделить одно число на другое. И показать пользователю что сумма частей равна исходному значению. И пользователь должен видеть значения с точностью до 2-х знаков. Грубо говоря у меня не получается правильно светить результат всей математики

Omh
Именно это и пытаюсь сделать :wacko:
 
O

Omh

Тогда поздравляю :wacko:
Если там потом ещё придётся вычитать налог от полной суммы и потом, например, показать налог на каждый товар, то вообще радости начнутся :(

Задача, кстати, несмотря на кажущуюся простоту, не такая уж и тривиальная.
Я на прошлой работе так и не дожал её реализацию: наколько мне известно, время от времени в инвойсах до сих пор лишняя копейка вылазит :)
 

NickProstoNick

Статус как статус :)
Lotus Team
22.08.2008
1 851
27
BIT
0
Omh
У тебя есть пистолет? :wacko:

Налоги, слава яйцам, считать не надо... пока... но эта лишняя копейка....
 
O

Omh

Ну пока я что вижу в твоей задаче?

Берём сумму 51,65 (s).
Делим на кол-во товаров (7).
Получаем цену товара неокруглённую: 7,37857...
Берём цену товара с точностью как нам надо без всяких округлений (допустим, 2 знака): 7,37

Считаем остаток: 51,65 - 7,37*7 = 6
Остаётся 6 копеек.
Раскидываем эти копейки по товарам.
Итого 6 товаров будут стоить 7,38 и один - 7,37

А что делать :wacko:
 

lmike

нет, пердело совершенство
Lotus Team
27.08.2008
7 985
611
BIT
473
значала была теория :)...
дык вот в большинстве своем Нотуся оперирует числами в "плавающем" формате - что есть зло
существует тип каренси - отличающийся точностью
но из-за округления мы получим разницу - по-любому
обычно - считают с округлением и без... и разницу приплюсовывают к какому-либо элементу массива (отнесение на конец/начало периода - ежели про бухгалтерию)
в случ. с товарами можно разносить, но не всегда это вариант
 
30.05.2006
1 345
12
BIT
0
дык вот в большинстве своем Нотуся оперирует числами в "плавающем" формате - что есть зло
существует тип каренси - отличающийся точностью
Currency отличается в 1-ю очередь не точностью, а арифметикой с фиксированной запятой AFAIR. Точность же может зависеть от платформы (возможно, конечно, что движок реализует ВСЮ арифметику программно.. но сомнительно). На Интелях currency реализована через 10-байтовую BCD, что точнее integer*4 и REAL*8 (часто). А на mainfreim-ах к примеру плавающая арифметика м.б. и 16-ти байтовая. BCD там тоже есть, но всего лишь 16-ти разрядная (8 байт). Как реализована currency на RISC-ах - х.з...
 
Мы в соцсетях:

Обучение наступательной кибербезопасности в игровой форме. Начать игру!