Форум программистов, компьютерный форум, киберфорум
Java
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 5.00/6: Рейтинг темы: голосов - 6, средняя оценка - 5.00
0 / 0 / 0
Регистрация: 30.07.2023
Сообщений: 3

Деление дает неверный результат (Android Studio)

31.07.2023, 00:05. Показов 1376. Ответов 13

Author24 — интернет-сервис помощи студентам
Доброго времени суток форумчане. Впервые на данном форуме, и хотел задать вопрос:

Заметил ньюанс при выполнении простейшей операции деления целых чисел, а именно если написать так:

Java Скопировано
1
2
float result = 100 / 4;
System.out.print(String.valueOf(result))
Компилятор выдаст результат: 25.0
Вроде бы ничего необычного, обычный калькулятор покажет точно такое же значение.

Однако ж, если написать:

Java Скопировано
1
2
float result = 101 / 4;
System.out.print(String.valueOf(result))
Компилятор так же покажет значение 25.0 вместо положенных 25.25
0:1 в пользу калькулятора.
Для того что бы компилятор выдал корректное значение необходимо создать переменную A, переменную B
и переменную result - результат, в таком случае компилятор покажет корректный результат.

Java Скопировано
1
2
3
4
float a = 100;
float b = 4;
float result = a / b;
System.out.print(String.valueOf(result))
Так же, "решением" получения верного результата является такая запись:
Java Скопировано
1
float result = (float) (101.0 / 4);
В таком случае так же результатом деления будет верное значение - 25.25


Кто нибудь знает в чем может быть причина такого неадекватного поведения (Android Studio) и почему запись
Java Скопировано
1
float result = 101/4;
не показывает логичный и понятный результат 25.25 а выдает что то неадекватное - 25.0 и просит кастовать выражение дописывая лишний код.
Спасибо за внимание!
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
31.07.2023, 00:05
Ответы с готовыми решениями:

Сравнение дат дает неверный результат
Date current = new Date(); SimpleDateFormat formatter = new SimpleDateFormat("dd-MM"); String message =...

Деление даёт неверный ответ
mov eax,11016 mov ebx,16384 xor edx, edx cdq idiv ebx после этого всего в edx просто помещается то же самое, что и в eax , а это...

Деление даёт неверный ответ, в чем ошибка?
mov eax,-50 imul eax, mov ebx, 180 imul eax, idiv ebx умножение нормальное(в смысле результат верный), а деление даёт неверный...

13
 Аватар для Coffeini
751 / 368 / 133
Регистрация: 01.02.2020
Сообщений: 1,094
Записей в блоге: 1
31.07.2023, 00:55
Java Скопировано
1
2
3
4
5
6
public class Main {
    public static void main(String[] args) {
        var r = 101 / 4.;
        System.out.println(r);//25.25
    }
}
0
0 / 0 / 0
Регистрация: 30.07.2023
Сообщений: 3
31.07.2023, 01:45  [ТС]
Это не работает для Android Studio.
0
Нарушитель
Эксперт функциональных языков программированияЭксперт С++
4520 / 2406 / 988
Регистрация: 01.06.2021
Сообщений: 8,300
31.07.2023, 23:15
Цитата Сообщение от krog1990 Посмотреть сообщение
Кто нибудь знает в чем может быть причина такого неадекватного поведения (Android Studio)
Java Скопировано
1
float result = 101 / 4; // 25.0
это абсолютно адекватное поведение в языке Java, всё так и должно быть, ибо 101 / 4 это целочисленное деление, остаток просто сбрасывается. Т.е. будто вы изначально пишете float result = 25; а потом просто конвертируете целое число 25 в float и получаете в выводе 25,0.

Чтобы получить то, что вы хотите (25,25), нужно писать:
Java Скопировано
1
float result = (float) 101 / 4;
или
Java Скопировано
1
float result = 101 / (float) 4;
или
Java Скопировано
1
float result = 101f / 4;
или
Java Скопировано
1
float result = 101 / 4f;
0
125 / 111 / 22
Регистрация: 12.12.2020
Сообщений: 941
31.07.2023, 23:36
это даже не именно джава, а особенность самого Си. Результат то у вас float, но делите вы целые числа и результат так же получаете в целых числах, а только потом приводите к float.

Возможно поможет
Java Скопировано
1
float result = 101.0 / 4.0;
0
Нарушитель
Эксперт функциональных языков программированияЭксперт С++
4520 / 2406 / 988
Регистрация: 01.06.2021
Сообщений: 8,300
31.07.2023, 23:44
Цитата Сообщение от Alex1126 Посмотреть сообщение
Java Скопировано
1
float result = 101.0 / 4.0;
выше я написал для ТС аж 4 варианта как правильно делить.

А у вас осуществляется деление двух double, а потом преобразование с потерей в float. А это ошибка error: incompatible types: possible lossy conversion from double to float. Так делать не надо.
Либо придется писать:
Java Скопировано
1
float result = (float) (101.0 / 4.0);
0
125 / 111 / 22
Регистрация: 12.12.2020
Сообщений: 941
31.07.2023, 23:48
Цитата Сообщение от Royal_X Посмотреть сообщение
А у вас осуществляется деление двух double, а потом преобразование с потерей в float. А это ошибка error: incompatible types: possible lossy conversion from double to float. Так делать не надо.
лень было студию запускать, проверить А разве еррор будет? Не варнинг? А, хотя на джаве может и еррор.
0
Нарушитель
Эксперт функциональных языков программированияЭксперт С++
4520 / 2406 / 988
Регистрация: 01.06.2021
Сообщений: 8,300
31.07.2023, 23:49
Цитата Сообщение от Alex1126 Посмотреть сообщение
лень было студию запускать
мне тоже было лень. Я проверил на https://www.onlinegdb.com/online_java_compiler. Там ошибка.
1
Эксперт .NET
 Аватар для Usaga
12863 / 8901 / 1322
Регистрация: 21.01.2016
Сообщений: 33,430
03.08.2023, 18:19
Цитата Сообщение от Alex1126 Посмотреть сообщение
это даже не именно джава, а особенность самого Си.
Причём тут Си?) Это поведение везде такое. Ты сам верно описал: сначала делятся целые, а потом результат приводится к float.
0
125 / 111 / 22
Регистрация: 12.12.2020
Сообщений: 941
03.08.2023, 18:47
Цитата Сообщение от Usaga Посмотреть сообщение
Причём тут Си?) Это поведение везде такое.
ну джава это вроде как наследник Си.
0
Эксперт .NET
 Аватар для Usaga
12863 / 8901 / 1322
Регистрация: 21.01.2016
Сообщений: 33,430
03.08.2023, 18:49
Alex1126, просто потому, что синтаксис похож в некоторых моментах?)
0
Модератор
Эксперт Java
 Аватар для alecss131
2749 / 1242 / 393
Регистрация: 11.08.2017
Сообщений: 3,870
Записей в блоге: 2
03.08.2023, 21:23
Цитата Сообщение от Usaga Посмотреть сообщение
Это поведение везде такое.
Не везде. Знаю си подобный язык где в итоге будет не целочисленное деление
0
Нарушитель
Эксперт функциональных языков программированияЭксперт С++
4520 / 2406 / 988
Регистрация: 01.06.2021
Сообщений: 8,300
04.08.2023, 01:43
в Python тоже не будет целочисленного деления, а если нужно, чтобы оно было, то для этого есть специальный оператор:
Python Скопировано
1
2
print(101/4) #25.25 division
print(101//4) #25 integer division
0
Эксперт .NET
 Аватар для Usaga
12863 / 8901 / 1322
Регистрация: 21.01.2016
Сообщений: 33,430
04.08.2023, 11:49
Ну, в JavaScript тоже такого нет. Но исключая эти языки, в остальных - везде)))
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
04.08.2023, 11:49
Помогаю со студенческими работами здесь

ChildWindowFromPoint даёт неверный результат
Есть WinForms приложение. В основном окне вызывается дочернее вот таким кодом:new RecordForm().ShowDialog(this);В этом дочернем окне...

Вычисление по формуле даёт неверный результат
#include <math.h> #include <iostream> #include <cstdlib> double ad,bd; float af,bf; using namespace std; int main() ...

Сравнение строк даёт неверный результат
Ткните, пожалуйста, что я делаю не так? Только начал изучать ООП. Как бы я не пытался, но в классе такого вида: class Друг :...

Программа дает неверный результат при вычислениях
Проблема в том, что программа считает неправильно, я считал с калькулятора и по формулам excel, и результат отличается от того что выдает...

Перемножение десятизначных чисел дает неверный результат
Добрый день ув. форумчане, столкнулся с проблемой, есть число 913, его надо умножить на 8млн. т.е. 913*8000000 и получим 7304000000,...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
14
Ответ Создать тему
Новые блоги и статьи
Миграция монолита в Event-Driven микросервисную архитектуру на C#
stackOverflow 11.04.2025
Монолитная архитектура – классический подход к разработке программного обеспечения. Это приложение, построенное как единое целое, где все компоненты тесно связаны между собой. Большинство проектов. . .
Go в Kubernetes: Управление ресурсами
golander 11.04.2025
Разработчики Go-приложений в Kubernetes часто сталкиваются с неожиданными проблемами производительности и даже внезапными отказами контейнеров. Причина этого кроется в особенностях взаимодействия. . .
Агрегаты и сущности в DDD микросервисах
Javaican 10.04.2025
Разработка современных программных систем часто приводит на распутье: монолит или микросервисы? Даже при выборе микросервисной архитектуры многие команды сталкиваются с проблемой правильного. . .
Многопоточность в C#: Task и параллельное программирование
UnmanagedCoder 10.04.2025
Современные процессоры уже давно перестали наращивать тактовую частоту в пользу увеличения количества ядер. Это создало интересную ситуацию: разработчики, привыкшие к последовательному. . .
Линейное решение нелинейной задачи будет иметь приблизительный результат вычисления для метода обработки данных из double buffering.
Hrethgir 10.04.2025
Вообще изначально я пренебрёг квадратурой числа, но потом понял, что для вычисления приблизительного значения - сгодится, формулу можно будет корректировать по ходу. Это потому что прямое соотношение. . .
Переменные в Python
py-thonny 10.04.2025
Переменная в программировании — это символическое имя, связанное с областью памяти, в которой хранится значение. Она позволяет получать доступ к данным через понятные человеку идентификаторы, а не. . .
Многопоточность в C#: Task и асинхронные операции
UnmanagedCoder 10.04.2025
Многопоточность позволяет выполнять несколько операций одновременно, что важно для решения двух основных задач: повышения скорости выполнения вычислительно-сложных операций и сохранения отзывчивости. . .
Запуск контейнеров Docker на ARM64
Mr. Docker 09.04.2025
Появление таких решений, как Apple M1/ M2, AWS Graviton, Ampere Altra и Raspberry Pi, сделало использование ARM-систем обыденностью для многих разработчиков и DevOps-инженеров. При этом Docker,. . .
Vue SFC компонент на PHP с Fusion
Jason-Webb 09.04.2025
PHP на сервере и JavaScript на клиенте — классическое сочетание, которое, несмотря на свою эффективность, создает определенный когнитивный диссонанс при разработке. В этом контексте появляются. . .
TypeScript vs JavaScript: Отличия и когда что использовать
Reangularity 09.04.2025
JavaScript появился в 1995 году как творение Брендана Эйха и быстро стал основой интерактивности в вебе. За свою историю он прошел путь от простого языка для манипуляций с DOM до полноценной. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru
Выделить код Копировать код Сохранить код Нормальный размер Увеличенный размер