Форум программистов, компьютерный форум, киберфорум
Java SE (J2SE)
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
Рейтинг 4.58/26: Рейтинг темы: голосов - 26, средняя оценка - 4.58
 Аватар для dollar8
13 / 13 / 0
Регистрация: 25.09.2011
Сообщений: 84

почему 3.3 *3 равно 9.899999999999999 ?

17.01.2012, 20:43. Показов 5666. Ответов 33
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Уверен, что вопрос банально простой. только не знаю как его задать Гуглу.
почему

Java
1
System.out.println(3.3*3);
дает ответ 9.899999999999999? а не 9.9

и как сделать по-человечески вывод?
заранее Спасибо за ответ!

а да. попутный вопрос. может кто подскажет с помощью чего можно вывести

Java
1
2
d= 3.0;
System.out.println(d);
на экран в виде 3 (т.е. чтобы отбрасывалась десятичная часть в случае, если там ноль)
и как чтобы

Java
1
2
d= 3.0;
String str = "" + d;
в стринг сохранялось так же без дясятичных нулей.

Спасибо.
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
17.01.2012, 20:43
Ответы с готовыми решениями:

Числа Люка определяются так: первое число равно 1, второе равно 3, каждое следующее равно сумме двух предыдущих. Состави
Задание Числа Люка определяются так: первое число равно 1, второе равно 3, каждое следующее равно сумме двух предыдущих. Составить...

Почему -(xi) равно (-x)i
Здравствуйте, срочно нужна помощь с маткадом! Почему -(xi) равно (-x)i Файл маткад прикреплю На картинке показала, что интересует

Почему Пи равно 3,14 а не 6,28?
Откуда берется Пи понятно - из соотношения дуги окружности и диаметра. Вопрос - почему правомерно дугу сравнивать с диаметром? Ведь...

33
Эксперт Java
 Аватар для turbanoff
4094 / 3828 / 745
Регистрация: 18.05.2010
Сообщений: 9,331
Записей в блоге: 12
20.01.2012, 18:02
Студворк — интернет-сервис помощи студентам
я же привел пример как делать, чтобы не было такого
мое сообщение
0
 Аватар для dollar8
13 / 13 / 0
Регистрация: 25.09.2011
Сообщений: 84
20.01.2012, 18:06  [ТС]
Цитата Сообщение от turbanoff Посмотреть сообщение
я же привел пример как делать, чтобы не было такого
мое сообщение
Спасибо!!!
просто сейчас именно с этим классом играюсь -- осталось протестировать на большие числа и перевести все действия умножения сложения вычитания и др. в методы класса BigDecimal и вывод в Стринг. потом отпишусь.

пока что вроде получается =)
0
Эксперт Java
 Аватар для turbanoff
4094 / 3828 / 745
Регистрация: 18.05.2010
Сообщений: 9,331
Записей в блоге: 12
20.01.2012, 18:27
Цитата Сообщение от dollar8 Посмотреть сообщение
осталось протестировать на большие числа
он хранит число как массив int-ов. Так что вместит любое число, на которое хватит памяти
0
 Аватар для dollar8
13 / 13 / 0
Регистрация: 25.09.2011
Сообщений: 84
20.01.2012, 18:44  [ТС]
Цитата Сообщение от turbanoff Посмотреть сообщение
так вы же используете конструктор BigDecimal(double).
вот у вас и идет потеря еще до вызова конструктора.

Если нужны дробные инициализаторы, пишите так:
Java
1
2
3
        BigDecimal bd  = new BigDecimal("3.3");
        BigDecimal bd2  = new BigDecimal(3);
        System.out.println(bd.multiply(bd2));
Code
1
9.9
Умножение работает наУРа))) спасибо еще раз
блин теперь с деление засада.
Java
1
2
3
4
BigDecimal num1_bd  = new BigDecimal("1.0");
            BigDecimal num2_bd  = new BigDecimal("3.0");
            num2_bd = num1_bd.divide(num2_bd);
            System.out.println(num2_bd.stripTrailingZeros());
вот ошибка
Java
1
2
3
Exception in thread "main" java.lang.ArithmeticException: Non-terminating decimal expansion; no exact representable decimal result.
    at java.math.BigDecimal.divide(Unknown Source)
    at test.main(test.java:45)
что можно с ней сделать? или для умножение использовать банальные doubleы ? глупо ведь.
0
Эксперт Java
 Аватар для turbanoff
4094 / 3828 / 745
Регистрация: 18.05.2010
Сообщений: 9,331
Записей в блоге: 12
20.01.2012, 19:23
есть еще вариант, если только 4 операции - сделать дробь-обертку на 2 BigDecimal.
у только когда понадобиться результат делить. так точность меньше потеряется

Добавлено через 7 минут
вот нашел обертку:
http://www.vacant-nebula.com/c... ava.source
1
 Аватар для dollar8
13 / 13 / 0
Регистрация: 25.09.2011
Сообщений: 84
22.01.2012, 00:51  [ТС]
Цитата Сообщение от turbanoff Посмотреть сообщение
есть еще вариант, если только 4 операции - сделать дробь-обертку на 2 BigDecimal.
у только когда понадобиться результат делить. так точность меньше потеряется

Добавлено через 7 минут
вот нашел обертку:
http://www.vacant-nebula.com/c... ava.source
Да спасибо за ссылку. разбираюсь в ней.
пока решил все применением класса BigDecimal только для операции умножения.

вот часть моего кода теперь.
Java
1
2
3
4
5
6
String num1;
String buf;
double answer;
BigDecimal num1_bd  = new BigDecimal(num1);
BigDecimal num2_bd  = new BigDecimal(buf);
    answer = num1_bd.multiply(num2_bd).doubleValue();
с делением этот класс как-то странно ведет--не до разобрался. да и так все прекрасно работает.

еще раз спасибо за помощь.
0
 Аватар для YuliLa
4 / 4 / 0
Регистрация: 15.10.2010
Сообщений: 71
22.01.2012, 01:07
Цитата Сообщение от aleksandy Посмотреть сообщение
Прежде, чем делать такие категоричные заявления неплохо было бы ознакомиться с матчастью.
Я о том, что вы java, не так с дробными числами как в иных распространенных ЯВУ =)
0
Эксперт Java
 Аватар для turbanoff
4094 / 3828 / 745
Регистрация: 18.05.2010
Сообщений: 9,331
Записей в блоге: 12
22.01.2012, 22:01
Цитата Сообщение от YuliLa Посмотреть сообщение
Я о том, что вы java, не так с дробными числами как в иных распространенных ЯВУ =)
Ну вы тогда докажите что трезвоните попусту. приведите пример на java, и на каком-нибудь другом/других ЯВУ
0
 Аватар для dollar8
13 / 13 / 0
Регистрация: 25.09.2011
Сообщений: 84
22.01.2012, 23:34  [ТС]
Цитата Сообщение от turbanoff Посмотреть сообщение
он хранит число как массив int-ов. Так что вместит любое число, на которое хватит памяти
а как он хранит числа с десятичной в периоде типа 0.333333333333333333333 ?
как я понимаю не хранит. т.е. если разделить 1/3 но пишет что не может найти конечное значение.
как округлять в таком случае? или что необходимо делать?

Java
1
2
3
4
        BigDecimal num1_bd = new BigDecimal(1);
        BigDecimal num2_bd = new BigDecimal(3);
 
        BigDecimal ans = num1_bd.divide(num2_bd);
0
Эксперт Java
 Аватар для turbanoff
4094 / 3828 / 745
Регистрация: 18.05.2010
Сообщений: 9,331
Записей в блоге: 12
23.01.2012, 06:50
Либо использовать BigFraction.
Либо окргулять вычисления с BigDecimal. Метод divide перегружен - можно указать до какого знака округлять, и способ округления
Java
1
2
3
4
5
6
BigDecimal s = new BigDecimal(1);
BigDecimal s2 = new BigDecimal(3);
 
s = s.divide(s2, 1000, RoundingMode.HALF_UP);
System.out.println("s = " + s);
//s = 0.3333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333
1
 Аватар для dollar8
13 / 13 / 0
Регистрация: 25.09.2011
Сообщений: 84
23.01.2012, 10:51  [ТС]
Цитата Сообщение от turbanoff Посмотреть сообщение
Либо использовать BigFraction.
Либо окргулять вычисления с BigDecimal. Метод divide перегружен - можно указать до какого знака округлять, и способ округления
Java
1
2
3
4
5
6
BigDecimal s = new BigDecimal(1);
BigDecimal s2 = new BigDecimal(3);
 
s = s.divide(s2, 1000, RoundingMode.HALF_UP);
System.out.println("s = " + s);
//s = 0.3333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333
ДА точно.
не заметил метода
Java
1
2
3
public BigDecimal divide(BigDecimal divisor,
                         int scale,
                         int roundingMode)
Спасибо.
извиняюсь за навязчивость. а как тогда в дополнение к вашему коду сделать чтобы s2 было равно 1,как в случае, если бы это были doubleы? в умножении ведь округление не имеет смысл.

Java
1
2
3
4
5
6
7
8
9
BigDecimal s = new BigDecimal(1);
BigDecimal s2 = new BigDecimal(3);
 
s = s.divide(s2, 1000, RoundingMode.HALF_UP);
BigDecimal s3 = s.multiply(s2);
System.out.println("s = " + s);
System.out.println("s2 = " + s2);
//s = 0.33333333333333333333333333333333333333333333333333333333333333333333333333333333333
//s2 = 0.9999999999999999999999999999999999999999999999999999999999999999999999999999999999
0
Эксперт Java
 Аватар для turbanoff
4094 / 3828 / 745
Регистрация: 18.05.2010
Сообщений: 9,331
Записей в блоге: 12
23.01.2012, 12:05
обычно вычисляют все с одной, более высокой точностью, а на вывод подают уже округленное значение.
примерно так:
Java
1
2
3
4
5
6
7
8
9
10
BigDecimal s = new BigDecimal(1);
BigDecimal s2 = new BigDecimal(3);        
 
 
s = s.divide(s2, 1002, RoundingMode.HALF_UP);
s = s.multiply(s2);
System.out.println("s = " + s);
 
s = s.round(new MathContext(1000)).stripTrailingZeros();
System.out.println("s = " + s);
Code
1
2
s = 0.9999999999999999999999999999999999999999999999999999...
s = 1


Доделал слегка BigFraction
http://paste.ubuntu.com/814062/

Java
1
2
3
4
5
6
7
8
BigFraction f = BigFraction.valueOf(1);
BigFraction f2 = BigFraction.valueOf(3);
 
f = f.divide(f2);
System.out.println(f);
 
f = f.multiply(f2);
System.out.println(f);
Code
1
2
0.3333333333333333333333333333333333333333333...
1
1
 Аватар для dollar8
13 / 13 / 0
Регистрация: 25.09.2011
Сообщений: 84
23.01.2012, 17:53  [ТС]
Цитата Сообщение от turbanoff Посмотреть сообщение
Доделал слегка BigFraction
http://paste.ubuntu.com/814062/
фигасе.
так это не стандартная библиотека уже?
мой андроид телефон не знал такие библиотеки. и я ему этому не научу.
а так-то конечно хороший класс.

Но с округлением наверное это не очень красивое решение. Проще уже тогда для умножения просто использовать double
Java
1
2
3
4
5
6
7
8
9
BigDecimal s = new BigDecimal(1);
        BigDecimal s2 = new BigDecimal(3);
 
        s = s.divide(s2, 17, RoundingMode.HALF_UP);
//      double s3 = s.multiply(s2).doubleValue();
//      или
        double s3 = s.doubleValue() * s2.doubleValue();
        System.out.println("s = " + s);
        System.out.println("s2 = " + s3);
0
Эксперт Java
 Аватар для turbanoff
4094 / 3828 / 745
Регистрация: 18.05.2010
Сообщений: 9,331
Записей в блоге: 12
23.01.2012, 18:07
и что выводит у вас? потеря точности идет, же, не при умножении, а при делении.

по поводу BigFraction: можно ведь просто добавить к себе как обычный класс. Если большой - можно вырезать не нужный вам функционал
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
23.01.2012, 18:07

почему х равно 15, а не 17
<?php $x = 5; echo "Переменная x=$x</br>"; function myFunction(){ $x = 2; } myFunction(); echo "Переменная...

Почему -1 не равно -1?
код var Form4: TForm4; xn,xs,xk,x11,x:real; a,b,c:integer; x1,d,l,p,y:extended; FName:string; implementation

Почему EOF равно -1?
#include <stdio.h> /* программа для вывода значения константы EOF */ main() { printf("%d\n", EOF); getch(); return 0; ...

Почему равно нулю?
Здравствуйте!У меня проблемы с кодом!Оно всегда равняется нулю,а должно к числу.Помогите пожалуйста;) #include <iostream> ...

Почему 0 в степени 0 равно 1?
Собственно, есть доказательства этого, что если взять ноль в степени ноль, то получим еденицу предлагаю обсудить я думаю тут есть...


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

Или воспользуйтесь поиском по форуму:
34
Ответ Создать тему
Новые блоги и статьи
Транслитерация текста с кириллицы на латиницу (вариант №2)
Maks 13.11.2026
Обновленная версия ранее созданной обработки. Добавлено: - Проверка исходного текста на кириллицу, через обращение к стандартной функции "ТолькоКириллицаВСтроке" из общего модуля. . .
Часы с термометром и праздничным календарем
yariko 12.11.2026
Сегодня мы рассмотрим как можно сделать отличные многофункциональные часы. Итак, поставим конкретную задачу: разработать часы с календарем, двумя термодатчиками, выводом поздравительных сообщений. . .
Транслитерация текста с кириллицы на латиницу (вариант №1)
Maks 11.11.2026
Решил облегчить жизнь себе и коллегам админам при создании электронных почтовых ящиков для пользователей, в результате написал обработку "Транслитерация текста" с кириллицы на латиницу, а в ней. . .
Книги по геймдизайну, левел-дизайну, игровым механикам и проектированию игрового опыта
8Observer8 08.11.2026
Содержание блога | English Version 1. 2003 - 06 - Designing Virtual Worlds (1st Edition) Автор: Richard A. Bartle | Объем: 768 стр. Ссылки: Amazon . . .
Родители токсичные абьюзеры по отношению к своим детям ругают их оскорбляют не любят
zorxor 08.11.2026
Жить в атмосфере постоянных оскорблений, критики и холодности со стороны родителей — это тяжелое и болезненное испытание, которое оставляет глубокие эмоциональные раны. Токсичное и абьюзивное. . .
Как только я захожу к себе в свою комнату я сразу же с себя снимаю свои трусы. Ответ от Джемени ИИ.
zorxor 08.11.2026
Джемени, как только я захожу к себе в свою комнату я сразу же с себя снимаю свои трусы. Многие люди, возвращаясь домой, сразу переодеваются в максимально свободную одежду или вовсе предпочитают. . .
Паттерн очереди действий/команд (Action / Command Queue). Система очереди действий и кат-сцен с SDL3 Callbacks, cglm и OpenGL
8Observer8 07.11.2026
Содержание блога | English Version Руководство для начинающих по реализации паттерна очереди действий/ команд (Action / Command Queue) на C++ (C++20) с использованием официального SDL3 Callbacks. . .
Проверка полного ФИО в типовом справочнике
Maks 07.11.2026
Решение реализовано в конфигурации КА2, на примере справочника "КонтактныеЛицаПартнеров". Задача: Запрет инициалов. Не допускаеть использование сокращений вида "И. И. ", "И. И. ", "И И" и. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru