Сообщение Re: Типы чисел в DSL от 03.12.2023 15:44
Изменено 03.12.2023 15:48 Pavel Dvorkin
Re: Типы чисел в DSL
Здравствуйте, Alekzander, Вы писали:
A>Возник вопрос на стыке проектирования, UX и БД )) Требуются ваши мнения.
A>Итак, что посоветуете для внутреннего представления чисел в памяти и хранения в sqlite? И какими типами это всё оформить для юзеров?
Ни в коей мере не считая себя специалистом в этом вопросе, выскажу мнение, которое наверняка уязвимо для критики.
Что знает обычный пользователь о данных ? Он знает то, чему его в школе учили. Что числа представляются с некоторой точностью. В десятичной, конечно, системе. Скажем, деньги (в рублях ) — с точностью 2 знака после запятой (копейки). И поэтому если 100 рублей разделить на троих, то каждый получит 33.33 рубля, а лишняя копейка пойдет в счет доходов аглицкого короля. Разделить ее на троих невозможно.
Соответственно, я бы ввел тип Number(I,F) — десятичное число, в котором может быть не более I знаков до запятой и ровно F знаков после.
И вариант его Number(,F) — ограничения на число знаков до запятой не вводится.
Операции производятся точно в смысле этих правил. Точно — в смысле как в школе учат, то есть по общепринятым в обычном мире правилам. При операндах разной точности результат имеет наибольшую точность.
100.00/3 == 33.33 (школьное деление с точностью до сотых)
100/3 == 3 (школьное деление целых с остатком, который игнорируем)
100.00/6 == 16.67 (школьное с точностью до сотых)
100/6.000 = 16.667 (школьное деление с точностью до тысячных)
100.0/6.000 = 16.667 (школьное деление с точностью до тысячных)
100.00/6.000 = 16.667 (школьное деление с точностью до тысячных)
100.000/6.000 = 16.667 (школьное деление с точностью до тысячных)
100.0000/6.000 = 16.6667 (школьное деление с точностью до десятитысячных)
P.S. Идея заимствована из PL/1. Там был тип DECIMAL FIXED(I,F)
A>Возник вопрос на стыке проектирования, UX и БД )) Требуются ваши мнения.
A>Итак, что посоветуете для внутреннего представления чисел в памяти и хранения в sqlite? И какими типами это всё оформить для юзеров?
Ни в коей мере не считая себя специалистом в этом вопросе, выскажу мнение, которое наверняка уязвимо для критики.
Что знает обычный пользователь о данных ? Он знает то, чему его в школе учили. Что числа представляются с некоторой точностью. В десятичной, конечно, системе. Скажем, деньги (в рублях ) — с точностью 2 знака после запятой (копейки). И поэтому если 100 рублей разделить на троих, то каждый получит 33.33 рубля, а лишняя копейка пойдет в счет доходов аглицкого короля. Разделить ее на троих невозможно.
Соответственно, я бы ввел тип Number(I,F) — десятичное число, в котором может быть не более I знаков до запятой и ровно F знаков после.
И вариант его Number(,F) — ограничения на число знаков до запятой не вводится.
Операции производятся точно в смысле этих правил. Точно — в смысле как в школе учат, то есть по общепринятым в обычном мире правилам. При операндах разной точности результат имеет наибольшую точность.
100.00/3 == 33.33 (школьное деление с точностью до сотых)
100/3 == 3 (школьное деление целых с остатком, который игнорируем)
100.00/6 == 16.67 (школьное с точностью до сотых)
100/6.000 = 16.667 (школьное деление с точностью до тысячных)
100.0/6.000 = 16.667 (школьное деление с точностью до тысячных)
100.00/6.000 = 16.667 (школьное деление с точностью до тысячных)
100.000/6.000 = 16.667 (школьное деление с точностью до тысячных)
100.0000/6.000 = 16.6667 (школьное деление с точностью до десятитысячных)
P.S. Идея заимствована из PL/1. Там был тип DECIMAL FIXED(I,F)
Re: Типы чисел в DSL
Здравствуйте, Alekzander, Вы писали:
A>Возник вопрос на стыке проектирования, UX и БД )) Требуются ваши мнения.
A>Итак, что посоветуете для внутреннего представления чисел в памяти и хранения в sqlite? И какими типами это всё оформить для юзеров?
Ни в коей мере не считая себя специалистом в этом вопросе, выскажу мнение, которое наверняка уязвимо для критики.
Что знает обычный пользователь о данных ? Он знает то, чему его в школе учили. Что числа представляются с некоторой точностью. В десятичной, конечно, системе. Скажем, деньги (в рублях ) — с точностью 2 знака после запятой (копейки). И поэтому если 100 рублей разделить на троих, то каждый получит 33.33 рубля, а лишняя копейка пойдет в счет доходов аглицкого короля. Разделить ее на троих невозможно.
Соответственно, я бы ввел тип Number(I,F) — десятичное число, в котором может быть не более I знаков до запятой и ровно F знаков после.
И вариант его Number(,F) — ограничения на число знаков до запятой не вводится.
Операции производятся точно в смысле этих правил. Точно — в смысле как в школе учат, то есть по общепринятым в обычном мире правилам. При операндах разной точности результат имеет наибольшую точность.
100.00/3 == 33.33 (школьное деление с точностью до сотых)
100/3 == 3 (школьное деление целых с остатком, который игнорируем)
100.00/6 == 16.67 (школьное с точностью до сотых)
100/6.000 = 16.667 (школьное деление с точностью до тысячных)
100.0/6.000 = 16.667 (школьное деление с точностью до тысячных)
100.00/6.000 = 16.667 (школьное деление с точностью до тысячных)
100.000/6.000 = 16.667 (школьное деление с точностью до тысячных)
100.0000/6.000 = 16.6667 (школьное деление с точностью до десятитысячных)
P.S. Идея заимствована из PL/1. Там был тип DECIMAL FIXED(I,F)
P.P.S Разумеется, округление и контроль переполнения — под капотом, в интерпретаторе DSL.
A>Возник вопрос на стыке проектирования, UX и БД )) Требуются ваши мнения.
A>Итак, что посоветуете для внутреннего представления чисел в памяти и хранения в sqlite? И какими типами это всё оформить для юзеров?
Ни в коей мере не считая себя специалистом в этом вопросе, выскажу мнение, которое наверняка уязвимо для критики.
Что знает обычный пользователь о данных ? Он знает то, чему его в школе учили. Что числа представляются с некоторой точностью. В десятичной, конечно, системе. Скажем, деньги (в рублях ) — с точностью 2 знака после запятой (копейки). И поэтому если 100 рублей разделить на троих, то каждый получит 33.33 рубля, а лишняя копейка пойдет в счет доходов аглицкого короля. Разделить ее на троих невозможно.
Соответственно, я бы ввел тип Number(I,F) — десятичное число, в котором может быть не более I знаков до запятой и ровно F знаков после.
И вариант его Number(,F) — ограничения на число знаков до запятой не вводится.
Операции производятся точно в смысле этих правил. Точно — в смысле как в школе учат, то есть по общепринятым в обычном мире правилам. При операндах разной точности результат имеет наибольшую точность.
100.00/3 == 33.33 (школьное деление с точностью до сотых)
100/3 == 3 (школьное деление целых с остатком, который игнорируем)
100.00/6 == 16.67 (школьное с точностью до сотых)
100/6.000 = 16.667 (школьное деление с точностью до тысячных)
100.0/6.000 = 16.667 (школьное деление с точностью до тысячных)
100.00/6.000 = 16.667 (школьное деление с точностью до тысячных)
100.000/6.000 = 16.667 (школьное деление с точностью до тысячных)
100.0000/6.000 = 16.6667 (школьное деление с точностью до десятитысячных)
P.S. Идея заимствована из PL/1. Там был тип DECIMAL FIXED(I,F)
P.P.S Разумеется, округление и контроль переполнения — под капотом, в интерпретаторе DSL.