powered by simpleCommunicator - 2.0.49     © 2025 Programmizd 02
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Проблемы с float
22 сообщений из 22, страница 1 из 1
Проблемы с float
    #37890527
denmat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
SQL2008r2


Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
declare
 @m float
 
set @m=150.20

select 
@m as a,                                   --150.2
CAST((@m * 100) as int) as b,      --15019
CAST((@m * 1000) as int) as c     --150200




Как с этим бороться? И почему именно при умножении на 100 вывалилась проблема?
Ясно, что лучше вообще избегать float, но у нас оно много где используется.
...
Рейтинг: 0 / 0
Проблемы с float
    #37890557
Фотография SomewhereSomehow
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
denmat,

float не точный тип, почему конкретно именно 150.2 на 100 не может правильно умножить и преобразовать к инту сказать трудно, 150.1 или 150.3 нормально проходят. В этом примере, можно привести сначала флоат к децималу, а потом уже с ним выполнять действия.
...
Рейтинг: 0 / 0
Проблемы с float
    #37890563
Фотография Сид
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
denmat,

потому что float - это весьма неточный тип данных, а приведение к int отсекает всю нецелую часть (а не округляет). Т.е. реально в переменной оказалось что-то типа 150.199999999 (цифру взял от балды).

Если так уж важен float, вместо int можно использовать decimal:

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
declare
 @m float
 
set @m=150.20

select 
@m as a,                                   --150.2
CAST((@m * 100) as dec(29,0)) as b,      --15020
CAST((@m * 1000) as dec(29,0)) as c     --150200



Но лучше изначально использовать decimal, особенно если в дальнейшем будет масса разных вычислений.
...
Рейтинг: 0 / 0
Проблемы с float
    #37890567
Фотография Сид
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
upd: пример с cast( as dec(29,10)) работает именно для 150.2, но не факт, что будет работать для другого числа.
Избавьтесь от float и не насилуйте мозг))
...
Рейтинг: 0 / 0
Проблемы с float
    #37890604
denmat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Избавиться дело не хитрое. Вот понять бы суть проблемы.
...
Рейтинг: 0 / 0
Проблемы с float
    #37890620
Glory
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
denmatВот понять бы суть проблемы.
Проблема с понимаем арифметики чисел с плавующей запятой
...
Рейтинг: 0 / 0
Проблемы с float
    #37890635
Фотография Shakill
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
denmatИзбавиться дело не хитрое. Вот понять бы суть проблемы.
потому что fioat - неточный тип, вам же сказали
Код: sql
1.
2.
declare @m float = 150.2
select cast(@m as decimal(20, 17))
...
Рейтинг: 0 / 0
Проблемы с float
    #37890812
мимо
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
denmat,
В типе флоат (как впрочем и в децимале и иных ), в отличии от инта, хранится не само число, а некая совокупность аргументов для определенной функции, согласно которой и вычисляется искомое. На пальцах
...
Рейтинг: 0 / 0
Проблемы с float
    #37890885
Фотография Deff
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
declare
 @m float
 
set @m=150.20

select 
@m as a,                                   --150.2
CAST((@m * 100) as int) as b,      --15019
CAST((@m * 1000) as int) as c    


select 
@m as a,                                   --150.2
@m * 100 as b,      --15020
@m * 1000 as c    --150200


Пофиг что флоат не точный тип. Это все равно явный косяк при конвертации.
...
Рейтинг: 0 / 0
Проблемы с float
    #37890890
Фотография Deff
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вот так кстати работает. И всегда будет работать

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
declare
 @m float
 
set @m=150.20

select 
@m as a,                                   --150.2
CAST(round((@m * 100),0) as int) as b      --15020
...
Рейтинг: 0 / 0
Проблемы с float
    #37890894
denmat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Я сделал
cast(@m numeric(18,2))
...
Рейтинг: 0 / 0
Проблемы с float
    #37890896
Фотография Deff
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вот что нашел в БОЛе.

http://msdn.microsoft.com/ru-ru/library/ms187928(SQL.90).aspx При преобразовании между типами данных с разными длинами дробных частей результат может усекаться или округляться . В следующей таблице описано это поведение.

Так что это задокументированный косяк.
...
Рейтинг: 0 / 0
Проблемы с float
    #37890897
Фотография Deff
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
denmatЯ сделал
cast(@m numeric(18,2))Это может не помочь, если это приведет к обрезанию.

Надо именно делать round до нужного количества. round гарантированно округлит по правилам.
...
Рейтинг: 0 / 0
Проблемы с float
    #37890906
Glory
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
DeffПофиг что флоат не точный тип. Это все равно явный косяк при конвертации.
Косяк - это для тех, кто не знает принципов работы с такими числами.
А для остальных - это нормально.
...
Рейтинг: 0 / 0
Проблемы с float
    #37890937
Фотография Deff
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
GloryDeffПофиг что флоат не точный тип. Это все равно явный косяк при конвертации.
Косяк - это для тех, кто не знает принципов работы с такими числами.
А для остальных - это нормально.Это задокументированный косяк. Не меняют его видимо ради совместимости с предыдущими версия. Когда-то так случайно получилось, так потом в документации и записали.
От того что я понимаю как устроен флоат, мне удобней работать не становится.
Это язык высокого уровня. При усечении дробной части вполне логично делать округление, а не обрезание.
...
Рейтинг: 0 / 0
Проблемы с float
    #37890951
Glory
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
DeffЭто задокументированный косяк
Это не косяк. Есть разные стандарты работы с числами с плавающей точкой.

DeffПри усечении дробной части вполне логично делать округление, а не обрезание
Удобнее кому ?
...
Рейтинг: 0 / 0
Проблемы с float
    #37890952
мимо
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
declare @float1 as float = 0.3
declare @float2 as float = 3
declare @float3 as float = 2
set @float1 =  (@float1/ @float2)*@float3 +255
set @float1 = (@float1-255)*@float2/@float3
select @float1


declare @d1 as decimal(18,8) = 0.3
declare @d2 as decimal(18,8) = 3
declare @d3 as decimal(18,8) = 2
set @d1 =  (@d1/@d2)*@d3 +255
set @d1 = (@d1-255)*@d2/@d3
select @d1
...
Рейтинг: 0 / 0
Проблемы с float
    #37890979
Фотография Deff
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
GloryDeffПри усечении дробной части вполне логично делать округление, а не обрезание
Удобнее кому ?Встречный вопрос. А кому удобней от того, что иногда усекает, иногда обрезает?
Сделано ради быстродействия? - Сомневаюсь.
...
Рейтинг: 0 / 0
Проблемы с float
    #37891002
Massa52
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Deff,

float используется для инженерных расчетов - там целые числа почти не используются. Ни один физик не оперирует целыми - у них там все приблизительно с точностью до ... И обычно операции с плавающей запятой выполняет специализированная часть проца. И если тебе нужно челое число - будь добр - округли с нужной точностью и переходи в область целых чисел. Не стоит мешать целое с плавающим - таково правило - если не хочешь проблем.
...
Рейтинг: 0 / 0
Проблемы с float
    #37891009
iap
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
DeffЭто задокументированный косяк. Не меняют его видимо ради совместимости с предыдущими версия. Когда-то так случайно получилось, так потом в документации и записали. Стандарт IEEE 754 :))
...
Рейтинг: 0 / 0
Проблемы с float
    #37891420
Lepsik
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Massa52Deff,

float используется с точностью до ... .

#define FLT_EPSILON 1.192092896e-07F /* smallest such that 1.0+FLT_EPSILON != 1.0 */
...
Рейтинг: 0 / 0
Проблемы с float
    #37892029
Glory
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
DeffВстречный вопрос. А кому удобней от того, что иногда усекает, иногда обрезает?
Сделано ради быстродействия? - Сомневаюсь.
Вы почему думаете, что разрядность операций и промежуточных результатов вещественных чисел у SQL Server бесконечна.
А также думаете, что неявное преобразование одних типов в другие делается по вашим правилам.
Вот умножьте массу солнца на массу электрона, используя только разрешенную в MSSQL точность для веществеееых чисел.
...
Рейтинг: 0 / 0
22 сообщений из 22, страница 1 из 1
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Проблемы с float
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]