4

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

 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.

jfs
  • 52,361

3 Answers3

2

Товарищ в комментариях подсказал еще один хороший способ, который при больших массивах данных гораздо более предпочтителен: Итак, у нас имеется результат вычислений 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)
<class 'pandas.core.frame.DataFrame'>

newmatrix
[1.099, -0.01575, 0.00689, -0.02598, 1.12, -0.002269, -0.02126, 0.005393, 1.191]

type(newmatrix)
<type 'list'>

Приводим 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
1

Для ваших данных накидал рабочий вариант.

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

но, думаю, вы идею поняли и легко допишите эту функцию

Vladimir
  • 1,298
1

Наткнулся на такой способ:

float('%.4g' % 1.195153)
1.195

проверил на всех числах, как раз то, что было нужно