Итак, вы хотите протестировать 1*X > Z*Y
, ничто не мешает вам сделать именно это, просто определите 1 (и, следовательно, 100%) как 10^decPlaces
, где decPlaces>=2
(иначе вам не хватит точностиделать проценты как int
s
, если вам нужно, чтобы расчеты были правильными с точностью до 4 dp, если X = 10
, то X_fixed_precision = 100000
, если Y составляет 30% (0,3), тогда Y_fixed_precision=3000
и если Z=10000
затем z_fixed_precision=100000000
этот трюк называется арифметикой с фиксированной точностью ...
Если вы хотите, чтобы производительность была еще лучше, используйте степени 2 вместо 10 (ее сложнее перевести в точное количество десятичных разрядов, которое вы получите, но это должно бытьнесколько быстрее)
например, ваш код, вероятно, будет выглядеть как
if (ONE_FIXED_PRECISION * X_fixed_precision > Z_fixed_precision * Y_fixed_precision)
// Do something
, где FOO_fixed_precision = FOO * ONE_FIXED_PRECISION
Будьте осторожны, чтобы избежать переполнения целыми числамихотя - максимальное значение X * ONE_FIXED_POINT * ONE_FIXED_POINT
должно быть меньше максимального значения, которое вы можете сохранить в слове (или двойном слове, если вы используете более длинные целочисленные типы)