Это не точность десятичных чисел, так как базовые поплавки хранятся в Java. Это демонстрирует:
<cfoutput>
<cfloop array="#[0.275,0.285,0.295]#" index="s">
#s.getClass().getName()#
<cfset f1 = s + 0>
#f1.getClass().getName()#
#f1.toString()#
<cfset f2 = f1*100>
#f2.toString()#
#round(f2)#<br>
</cfloop>
</cfoutput>
Выход:
java.lang.String java.lang.Double 0.275 27.500000000000004 28
java.lang.String java.lang.Double 0.285 28.499999999999996 28
java.lang.String java.lang.Double 0.295 29.5 30
blockquote>Я могу предположить только под капотом CF использует лучшую точность при преобразовании из строки в float при выполнении
<cfset f1 = s + 0>
, так как там нет хитрого округления. Однако, выполнив шаг умножения, мы получаем ошибку с погрешностью. 28.5 заканчивается просто застенчивым 28,5, поэтому раунды до 28 нет 29. Это просто арифметическая проблема двоичной фракции.Кстати, есть ничего особенного около 0.285. Аналогичным образом выполняется множество чисел (см. Диапазон от 0,005 до 5,05). Вы только что выбрали пучок, который не является (кроме 0.285).
Вы должны использовать String
вместо 'string'
для типа:
@ApiImplicitBody({ name: 'name', description: 'Infographic title', type: String })
^^^^^^
<час>