Сначала вы не можете избежать обратного преобразования кода. Байт-код JVM должен быть простым для выполнения, и есть несколько программ для его обратной инженерии (то же самое относится к .NET CLR). Вы можете только сделать все труднее поднять барьер (т. Е. Стоимость), чтобы видеть и понимать ваш код.
Обычный способ - обфускать источник с помощью какого-либо инструмента. Классы, методы и поля переименовываются на протяжении всей кодовой базы, даже с недопустимыми идентификаторами, если вы решите, что делает код, который невозможно понять. У меня были хорошие результаты с JODE в прошлом. После обфускации используйте декомпилятор, чтобы увидеть, как выглядит ваш код ...
Рядом с обфускацией вы можете с помощью некоторого метода шифровать файлы классов (все, кроме небольшого стартового класса), и использовать специальный загрузчик классов для расшифровки их. К сожалению, класс загрузчика классов не может быть зашифрован сам, поэтому люди могут определить алгоритм дешифрования, прочитав декомпилированный код вашего загрузчика классов. Но окно для атаки вашего кода стало меньше. Опять же, это не мешает людям видеть ваш код, просто делает его труднее для случайного злоумышленника.
Вы также можете попробовать конвертировать приложение Java в некоторые окна EXE, которые скроют ключ, что это Java вообще (в некоторой степени) или действительно скомпилировать в машинный код, в зависимости от вашей потребности в JVM-функциях. (Я не пробовал это.)
Кастинг для десятичной дроби работал для меня:
SELECT * FROM table WHERE CAST(price AS DECIMAL) = CAST(101.31 AS DECIMAL);
Однако вам может потребоваться просто сделать столбец price
DECIMAL в первую очередь. DECIMAL обычно считается лучшим типом для использования при работе с денежными значениями.
Это не работает, потому что поплавок по своей сути является неточным. Фактическое значение, вероятно, похоже на «101.3100000000001». Сначала вы можете использовать ROUND () для округления до 2-х мест или лучше использовать тип DECIMAL вместо float.
Я искал решение, но, наконец, я сделал это, используя мой предыдущий php number_format (), который появился в решении @ hmasif's.
Используйте это, и вы получите свое совпадение с float-mysql:
$floatmatch = number_format((float)$yourfloatvariable,5);
где 5 - пять строк из десятичной точки. например 7,93643
Возможно, что-то вроде этого:
SELECT * FROM table WHERE ident='ident23' AND ABS(price - 101.31) < .01;
Это работает?
SELECT * , ROUND( price, 2 ) rounded
FROM table
WHERE ident = 'ident23'
HAVING rounded = 101.31
DECIMAL(M,D)
.CAST(101.31 AS DECIMAL) = 101
– Karoly Horvath 24 October 2012 в 16:39