Google Sheet дает бесконечно малое число как остаток от целого/целого числа

У меня есть этот рабочий лист, где мне нужно создать средство проверки, чтобы определить, является ли число (результат деления суммы двух чисел на другое значение --DIVISOR) целым числом/не имеет десятичных знаков. После запуска указанной программы проверки она в основном работала нормально, но, похоже, обнаружила, что несколько элементов не являются целыми числами, несмотря на то, что они точно кратны DIVISOR.

https://docs.google.com/spreadsheets/d/17-idS5G0kUI7JoHAx3qcJOiJ-zofmMrg93hUvZuxPiA/edit#gid=0

Google Sheet дает бесконечно малое число как остаток от целого/целого числа

У меня есть два значения (V1 и V2), сумму которых мне нужно разделить на определенное число (делитель).

Мне нужно, чтобы ВЫВОД был целым/целым числом. Поскольку ДЕЛИТЕЛЬ кратен СУММЕ (V1,V2), ВЫВОД должен быть целым числом. Я также расширил количество знаков после запятой, чтобы убедиться, что после запятой нет конечных чисел.

Однако при выполнении функции MOD над ВЫВОДОМ она сгенерировала некоторое бесконечно малое значение.

Я также попытался ОБРЕЗАТЬ ВЫВОД и получить РАЗНИЦУ между ОБРЕЗОМ и ВЫВОДОМ. Это дало то же остаточное значение, что и результат MOD.

Я скачал GSheet и открыл его в MS Excel. Кажется, что с результатом РАЗНИЦА проблем нет, но функция ОСТАТ дала еще одно значение.

Google Sheet дает бесконечно малое число как остаток от целого/целого числа

Ни 983386.8, ни 9933.2 не могут быть представлены в виде конечных двоичных расширений, поэтому большинство программ будут округлять их и вносить некоторую ошибку (за исключением тех программ, которые имеют возможность использовать (намного более медленное) десятичное представление). Есть ли в Google Таблицах возможность пометить ячейку как десятичное значение? Возможно ли округление значений, которые должны быть целыми числами, до целых чисел? Существует ли максимальный знаменатель, на который можно умножать каждое значение (например, если вы работаете с деньгами, можете ли вы работать с целыми числами в центах, а не с дробными числами в долларах)?

HTNW 23.11.2022 08:19

образец электронной таблицы не открыт для доступа.

Ping 23.11.2022 08:26

@Ping Спасибо за флаг. Я отредактировал разрешение, чтобы к нему мог получить доступ любой.

qzxrt 23.11.2022 08:58

@HTNW Спасибо за ответ. Я все еще пытаюсь переварить ваш ответ, поэтому, пожалуйста, поправьте меня, если есть какое-либо неправильное толкование. ПЕРВЫЙ, связанный с конечными бинарными расширениями, я включил другой пример в ссылку выше, где GSheet удалось сгенерировать ожидаемый результат. На моем листе у меня есть 172 строки, над которыми я запустил проверку. Из них только 7 имели бесконечно малые остатки, несмотря на то, что они были в точности кратны ДЕЛИТЕЛЮ. Кажется, я не могу найти какой-либо закономерности в этих 7 случаях.

qzxrt 23.11.2022 09:16

@HTNW SECOND, не уверен, что это то, что вы имеете в виду, но я использую формат «Число» по умолчанию в GSheet для рассматриваемых ячеек. Я также пытался использовать формат «Финансы», но результаты были такими же. Я попытался погуглить «отметить ячейку как десятичную в GSheet», но я не могу найти никаких подходящих ответов, кроме форматирования чисел, о котором я упоминал выше. ТРЕТЬЕ, к сожалению, округление значений не вариант, так как я ожидаю, что все значения будут кратны определенной константе, чтобы проверить, были ли просчеты или опечатки во входных данных.

qzxrt 23.11.2022 09:24

@HTNW ЧЕТВЕРТЫЙ (1/2), V1 и V2 в ссылке GSheet на самом деле являются денежными значениями. Константа/делитель (760) – это цена за единицу. Причина разбивки (99% и 1%) заключается в том, что с каждого платежа удерживается сумма, равная 1% от общей суммы комиссии. Следовательно, то, что я на самом деле имею в качестве основного входа, — это 99%. Затем я получаю комиссию за удержание в размере 1% (вторичные данные), используя первичные входные данные. Затем я делю сумму первичных входных и вторичных данных на цену за единицу (760). Таким образом, я могу пометить полученные значения десятичными знаками, поскольку я ожидаю, что они будут целыми числами.

qzxrt 23.11.2022 09:35

@HTNW ЧЕТВЕРТЫЙ (2/2) Я попытался отдельно обработать часть ЦЕЛОГО ЧИСЛА от части ДЕСЯТИЧНЫХ значений, как было предложено, и фактически исключил бесконечно малый остаток. Однако в контрпримере (с правильными результатами), который я привел в ссылке GSheet, он сгенерировал бесконечно малый остаток с помощью дезагрегированного процесса. Вот скриншот для большей наглядности: imgur.com/a/e104sSb

qzxrt 23.11.2022 10:00
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
2
7
64
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

на самом деле, это не ошибка, и это довольно распространено. его называют «ошибкой» с плавающей запятой, и, в двух словах, он должен делать что-то с тем, как десятичные числа хранятся в листах Google (даже excel или любом другом приложении)

более подробную информацию можно найти здесь: https://en.wikipedia.org/wiki/IEEE_754

чтобы противостоять этому, вам нужно будет ввести округление, например:

=ROUND(SUM(A1:A))

это не идеальное решение для всех случаев, поэтому в зависимости от ваших требований вам может понадобиться использовать их вместо ROUND:

ROUNDUP
ROUNDDOWN
TRUNC
TEXT

Спасибо за ссылку на Вики. Я так ошеломлен прямо сейчас, что такая простая функция, как ROUND, решила бы мою проблему. На самом деле это было предложено @HTNW, но оно округляло значения до целых чисел. Вместо этого я просто округлю числа до двух-трех знаков после запятой. Я думаю, что это будет работать на данный момент, так как я заметил, что все бесконечно малые значения остатка были равны 10 ^ -11. Большое вам спасибо за вашу помощь.

qzxrt 23.11.2022 10:58

@qzxrt дополнительные (не-GS) материалы для чтения, если необходимо: stackoverflow.com/questions/21895756 & stackoverflow.com/questions/588004

player0 23.11.2022 11:18

вау, спасибо, что поделились! это действительно полезные чтения. ваше здоровье!

qzxrt 24.11.2022 09:53

Другие вопросы по теме