Большинство чисел не может быть точно представлено в плаваниях. Если Вы хотите к раунду число, потому что это - то, чего требуют Ваша математическая формула или алгоритм, то Вы хотите использовать вокруг. Если Вы просто хотите ограничить дисплей определенной точностью, то даже не используйте вокруг и просто форматируйте его как ту строку. (Если Вы хотите отобразить его с некоторым альтернативным методом округления, и существуют тонны, тогда необходимо смешать два подхода.)
>>> "%.2f" % 3.14159
'3.14'
>>> "%.2f" % 13.9499999
'13.95'
И наконец, хотя, возможно, самое главное, если Вы хотите точный математика тогда, Вы не хотите плавания вообще. Обычный пример имеет дело с деньгами и сохранить 'центы' как целое число.
Он возвращает необработанные байты, вам нужно преобразовать их в шестнадцатеричное.
$x = unpack("H*", $row[0]);
echo $x[1];
Похоже, что то, что печатается из запроса Oracle, - это необработанный поток байтов контрольной суммы md5, искаженный, потому что большинство этих октетов не будут символами ascii. Попробуйте сначала преобразовать его в шестнадцатеричное.
Если вы хотите иметь md5 в Oracle, вы можете использовать этот метод:
select lower(rawtohex(md5hash('foobar'))) from dual
Немного молчаливо, но это сработает:
>>> class BankAccount(object): pass
...
>>> class SavingsAccount(BankAccount): pass
...
>>> class CheckingAccount(BankAccount): pass
...
>>> x = SavingsAccount()
>>> type(x) == type(SavingsAccount())
True
>>> type(x) == type(CheckingAccount())
False
-121--2995468- Я установил 2010 с 2008 на этой машине для разработки серебряного света.. Я не заметил никаких проблем, кроме ассоциаций файлов все перейти к версии 2010, а не то, что я предпочел бы открыть в 2008 по умолчанию. (2010 год для меня намного медленнее 2008 года)
-121--2666441-Я получил ту же самую «числовую ошибку или ошибку значения» и обнаружил, что две функции работают вместе:
CREATE OR REPLACE FUNCTION MD5RAW( v_input_string in varchar2 )
RETURN varchar2 IS
v_checksum varchar2( 32 );
BEGIN
v_checksum := SYS.DBMS_OBFUSCATION_TOOLKIT.MD5( input_string => v_input_string );
return v_checksum;
END;
CREATE OR REPLACE FUNCTION MD5HEX( v_input_string in varchar2 )
RETURN varchar2 IS
v_hex_value varchar2( 32 );
BEGIN
SELECT LOWER( RAWTOHEX( MD5RAW( v_input_string ) ) )
INTO v_hex_value
FROM dual;
return v_hex_value;
END;
Затем вы можете выполнить этот запрос, чтобы получить контрольную сумму:
SELECT md5hex( 'my string smoked your hash' ) FROM dual;
Эта вторая функция делает то же самое, что и выдача инструкции SELECT, предоставленной Bazz для функции, которую вы предоставляете, но я предпочитаю не делать rawToHex -- > меньшее преобразование внутри каждого запроса. Это оставляет слишком много вещей, чтобы потенциально пойти не так каждый раз, когда вы используете запрос. Я думаю, что это может быть и быстрее, так как он компилируется во время создания, а не во время выполнения, но я могу ошибаться в этом.
Создайте функцию, подобную следующей:
create or replace
function md5( input varchar2 ) return sys.dbms_obfuscation_toolkit.varchar2_checksum as
begin
return lower(rawtohex(utl_raw.cast_to_raw(sys.dbms_obfuscation_toolkit.md5( input_string => input ))));
end;
, и вызовите ее следующим образом:
select md5('foobar') from dual;
кажется, что «dbms_obfuscation_toolkit.md5» на самом деле не возвращается в исходном формате, поэтому необходимо вызвать «utl_raw.cast_to_raw». Я могу ошибаться, этому должно быть лучшее объяснение.