Страницы

Поиск по вопросам

пятница, 10 января 2020 г.

Округление после четырёх значащих цифр Python

#python #pandas


Имеется следующий результат вычислений:          

 1.103567  -0.015367  0.000616
-0.023323   1.138369 -0.018582
-0.003442   0.004548  1.195153


Устройство преобразует эти числа следующим образом:

[1.104, -0.01537, 0.000616, 
 -0.02332, 1.138, -0.01858,
 -0.003442, 0.004548, 1.195]


Для дальнейшей работы необходимо сравнивать вычисления и числа внутри устройства,
поэтому возникла потребность в округлении результатов вычислений так же, как это делается
на устройстве. Round не даёт удовлетворительного результата.



где m это DataFrame.
    


Ответы

Ответ 1



Товарищ в комментариях подсказал еще один хороший способ, который при больших массивах данных гораздо более предпочтителен: Итак, у нас имеется результат вычислений m и данные с устройства newmatrix. Их необходимо сравнить. import numpy as np import pandas as pd m 0 1 2 0 1.099394 -0.015754 0.006890 1 -0.025979 1.119590 -0.002269 2 -0.021262 0.005393 1.191073 type(m) newmatrix [1.099, -0.01575, 0.00689, -0.02598, 1.12, -0.002269, -0.02126, 0.005393, 1.191] type(newmatrix) Приводим newmatrix к формату DataFrame mat=np.array(newmatrix) mat=mat.reshape((3,3)) mat=pd.DataFrame(mat) mat 0 1 2 0 1.09900 -0.015750 0.006890 1 -0.02598 1.120000 -0.002269 2 -0.02126 0.005393 1.191000 И затем одной функцией производим сравнение: numpy.allclose(m, mat, 1e-3,0) True

Ответ 2



Для ваших данных накидал рабочий вариант. import math def SpecialRaund(val, n): exponent = 0 while abs(val) < 1: val *= 10 exponent -= 1 val = round(val, n) val *= math.pow(10, exponent) return val print SpecialRaund(1.103567, 3) print SpecialRaund(-0.015367, 3) print SpecialRaund(0.000616, 3) Result: 1.104 -0.01537 0.000616 В SpecialRaund не рассматривается кейс с положительным порядком числа (в терминах мантиса-порядок). Таким образом print SpecialRaund(11035.678934, 3) Result: 11035.679 но, думаю, вы идею поняли и легко допишите эту функцию

Ответ 3



Наткнулся на такой способ: float('%.4g' % 1.195153) 1.195 проверил на всех числах, как раз то, что было нужно

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

Отправить комментарий