forum.boolean.name

forum.boolean.name (http://forum.boolean.name/index.php)
-   FAQ и уроки (http://forum.boolean.name/forumdisplay.php?f=110)
-   -   70/100.0 = 0.699999988 (http://forum.boolean.name/showthread.php?t=18706)

Vanys Dae 13.11.2013 04:55

70/100.0 = 0.699999988
 
Доброго времени суток.

Пол ночи бился с решением, и никак не смог добиться нормального деления. Решил в итоге написать сюда.

Подскажите, как быть? Чтобы было 70/100.0 = 0.7

Код:


Print "70/100.0 = "+(70/100.0)

Print "Round(70/100.0 , 2) = "+Round(70/100.0 , 2)

Print "Float(Round(70/100.0 , 2)) = "+Float(Round(70/100.0 , 2))
                       

'========================================================================================

'округляет число до Х знаков после запятой
'с учётом Х+1 знака.
' тоесть 0.9999 округлит до 1, а не до 0.9, как по дефолту

Function Round$(value#, nDecimals%=2)
       
        'получаем строку из цифры
    Local str$ = value
       
        'узнаём, где запятая
    Local pos% = Instr(str , ".")

        'узнаём, что находится на Х+1
        Local nxt%= Int(Chr(str[pos + nDecimals]))
        'Print "находится на Х+1 = "+nxt

        'Математическое округление — округление всегда в бо́льшую по модулю сторону (предыдущий разряд всегда увеличивается на единицу).
        If nxt=>5
                'Print "Математическое округление"
               
                Local add$="0."
                For Local n=1 To (nDecimals) add=add+"0" Next
               
                add=add+"1"

                value=value+Float(add)

                'Print add
                'Print value
               
        EndIf
       
        'снова получаем строку из цифры
    str$ = value

    If nDecimals > 0
        str = str[..pos + nDecimals]
    Else
        str = str[..pos - 1]
    EndIf

    Return str

EndFunction

Выводит:
Код:

70/100.0 = 0.699999988
Round(70/100.0 , 2) = 0.70
Float(Round(70/100.0 , 2)) = 0.699999988

З.ы. Делаю игру. Если кому интересно - www.graverun.ru

moka 13.11.2013 04:58

Ответ: 70/100.0 = 0.699999988
 
Проблемы с float'ами - дело обычное к сожалению..
Вот почитай:
http://effbot.org/pyfaq/why-are-floa...inaccurate.htm

Да и на сайте скринов очень не хватает..

Vanys Dae 13.11.2013 05:16

Ответ: 70/100.0 = 0.699999988
 
Цитата:

Сообщение от moka (Сообщение 270142)
Проблемы с float'ами - дело обычное к сожалению..
Вот почитай:
http://effbot.org/pyfaq/why-are-floa...inaccurate.htm

Да и на сайте скринов очень не хватает..

О! Шустро. Спасибо за ответ, почитаю.

Да, нужно бы добавить раздел с медиа на сайт. Но всё довольно быстро меняется, потому его ещё нет.
Скрины и старый видос размещены в группе, в ВК. Просто подумал, что будет не солидно размещать здесь адрес на неё)

Черный крыс 13.11.2013 07:52

Ответ: 70/100.0 = 0.699999988
 
опередили

impersonalis 13.11.2013 10:51

Ответ: 70/100.0 = 0.699999988
 
Не успел

http://forum.boolean.name/showthread...9543#post29543
http://forum.boolean.name/showthread...149#post233149

Vanys Dae 13.11.2013 15:00

Ответ: 70/100.0 = 0.699999988
 
В итоге сделал всё через проценты, а не множители.
Таким образом, просто не используя числа, близкие к нулю.

Даже не думал, что такая подстава кроется во float'ах


Часовой пояс GMT +4, время: 06:02.

vBulletin® Version 3.6.5.
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Перевод: zCarot