Как мне преобразовать десятичное число с плавающей запятой в восьмеричное / двоичное число с плавающей запятой?

#python #binary #floating-point #octal

#python #двоичный #с плавающей запятой #восьмеричное

Вопрос:

Меня везде искали, чтобы найти способ преобразовать число с плавающей запятой в восьмеричное или двоичное число. Я знаю о float.hex и float.fromhex . Есть ли модули, которые могут выполнять ту же работу для восьмеричных / двоичных значений?

Например: у меня есть число с плавающей 12.325 запятой, и я должен получить восьмеричное число с плавающей 14.246 запятой. Скажите мне, как я могу это сделать? Заранее спасибо.

Комментарии:

1. Для чего это? Можете ли вы привести несколько примеров желаемого ввода и вывода? Представление значений с плавающей запятой в восьмеричном формате — очень необычная вещь. Для двоичного кода вы можете просто использовать float.hex , а затем использовать строковые операции для замены каждой шестнадцатеричной цифры ее 4-разрядным двоичным эквивалентом.

2. @MarkDickinson например: у меня есть число с плавающей 12.325 запятой, и я должен получить восьмеричное число с плавающей 14.246 запятой (округленное). Я понятия не имею, как это сделать

3. Спасибо за пример; было бы полезно отредактировать это в самом вопросе. Кроме того, можете ли вы объяснить, что вы подразумеваете под «восьмеричным числом с плавающей запятой». Вы имеете в виду конкретное целевое представление с плавающей запятой или просто хотите, чтобы значение было записано в восьмеричном виде как с целой, так и с дробной частью?

4. @MarkDickinson Мне просто нужно значение. Для использования в качестве калькулятора

5. Как оно округляется до 246?

Ответ №1:

Вы могли бы написать свое собственное, если вас интересуют только три десятичных знака, затем установите n равным 3:

 def frac_to_oct(f, n=4):
    # store the number before the decimal point
    whole = int(f)
    rem = (f - whole) * 8
    int_ = int(rem)
    rem = (rem - int_) * 8
    octals = [str(int_)]
    count = 1
    # loop until 8 * rem gives you a whole num or n times
    while rem and count < n:
        count  = 1
        int_ = int(rem)
        rem = (rem - int_) * 8
        octals.append(str(int_))
    return float("{:o}.{}".format(whole, "".join(octals)))
 

Используя ваш ввод 12.325:

 In [9]: frac_to_oct(12.325)
Out[9]: 14.2463
In [10]: frac_to_oct(121212.325, 4)
Out[10]: 354574.2463

In [11]: frac_to_oct(0.325, 4)
Out[11]: 0.2463
In [12]: frac_to_oct(2.1, 4)
Out[12]: 2.0631
In [13]:  frac_to_oct(0)
Out[13]: 0.0
In [14]:  frac_to_oct(33)
Out[14]: 41.0
 

Комментарии:

1. Кхм … frac(12.325) дает мне 10,24631 . Что-то не так, но я этого не вижу

2. @MaxLunar. Кхм, это не так, как вы можете видеть. Если, конечно, ваш язык не может влиять на результат

3. Это «решение» не работает. Это дает неправильные значения.

4. 12.325 должен возвращать 14.246, а не 10.24631.

5. @Frogboxe, я пропустил преобразование целого числа, также должно быть возвращено неверное значение 14.246, оно соответствует точности, которую вы решаете, или 8 * rem дает вам целое число

Ответ №2:

Вот решение, объяснение ниже:

 def ToLessThanOne(num): # Change "num" into a decimal <1
    while num > 1:
        num /= 10
    return num

def FloatToOctal(flo, places=8): # Flo is float, places is octal places
    main, dec = str(flo).split(".") # Split into Main (integer component)
                                    # and Dec (decimal component)
    main, dec = int(main), int(dec) # Turn into integers

    res = oct(main)[2::] "." # Turn the integer component into an octal value
                             # while removing the "ox" that would normally appear ([2::])
                             # Also, res means result

    # NOTE: main and dec are being recycled here

    for x in range(places): 
        main, dec = str((ToLessThanOne(dec))*8).split(".") # main is integer octal
                                                           # component
                                                           # dec is octal point
                                                           # component
        dec = int(dec) # make dec an integer

        res  = main # Add the octal num to the end of the result

    return res # finally return the result
 

Итак, вы можете сделать print(FloatToOctal(12.325)) , и оно будет распечатано 14.246314631

Наконец, если вам нужно меньше восьмеричных разрядов (десятичных разрядов, но в восьмеричном), просто добавьте places аргумент: print(FloatToOctal(12.325, 3)) который возвращает 14.246 как правильно в соответствии с этим сайтом: http://coderstoolbox.net/number /