Swift.Create MLDataTable. Непонятное поведение Double при конвертацию в таблицу

let pages = MLUntypedColumn([192980.8718626261, 19298087186262.61, 19298087186262.61, 19298087186262.61])
    let genre = MLUntypedColumn(["Fantasy", "Drama", "Adventure", "Fantasy"])
    let bookTable = try MLDataTable(namedColumns: [
                                                   "Pages": pages,
                                                   "Genre": genre])
    print(bookTable )

В pages имеем массив Double. При создании таблицы MLDataTable, значение 19298087186262.61, конвертируется в 1.92981e+13. Это происходит, если до знака более 6 символов. Если менее (как в 1 значении ), то просто обрезает после 6 знака все. Подскажите, пожалуйста, что тут происходит и как поправить?


Ответы (1 шт):

Автор решения: VAndrJ

В данном случае в pages Вы имеете массив float, так как в MLDataTable приводится к одинарной точности.

Вещественные числа в памяти представляются как знак-порядок-мантисса. Когда знаков более 6 (для одинарной точности), происходит потеря точности. В итоге, видим как теряется дробная часть или подобное: 1.92981e+13

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

192980.8718626261 -> 192980

Для больших чисел увидим множитель и степень:

19298087186262.61 -> 1.92981e+13

1.92981e+13 по-простому: 1.92981 умножить на 10 в 13 степени.

Это если кратко. Если подробно - ищите информацию по представлению вещественных чисел.

→ Ссылка