我的任務是將一個小型內部公司公式/演算法從 Java 移植到 PHP,并且大部分都成功了,但顯然在某個地方出錯了,因為我從移植版本中得到的輸出與我不同從 PHP 版本。我對 PHP 比較陌生,對 Java 一無所知,所以我猜我在這兩種語言的數學運算方式上遺漏了一個微妙但至關重要的區別,特別是與doubleandfloor()函式有關的地方。
這是原始的 Java 代碼,它需要以格式獲取用戶輸入F999并生成四位數的輸出:
String input;
String Generate() {
int charAt = (((this.input.charAt(0) * 5) * 2) - 698) this.input.charAt(1);
int charAt2 = ((((this.input.charAt(2) * 5) * 2) charAt) this.input.charAt(3)) - 528;
charAt2 = ((charAt2 << 3) - charAt2) % 100;
String valueOf = String.valueOf((((((259 % charAt) % 100) * 5) * 5) * 4) ((((charAt2 % 10) * 5) * 2) ((int) Math.floor((double) (charAt2 / 10)))));
return valueOf.length() == 3 ? "0" valueOf : valueOf.length() == 2 ? "00" valueOf : valueOf.length() == 1 ? "000" valueOf : valueOf;
}
這是我移植的 PHP 版本,目前使用字串模擬用戶輸入:
$input = "F999"; # should output 2360
$charAt = ((((int) $input[0] * 5) * 2) - 698) $input[1];
$charAt2 = (((($input[2] * 5) * 2) $charAt) $input[3]) - 528;
$charAt2 = (($charAt2 << 3) - $charAt2) % 100;
$valueOf = strval(((((((259 % $charAt) % 100) * 5) * 5) * 4) (((($charAt2 % 10) * 5) * 2) ((int) floor((double) ($charAt2 / 10))))));
if (strlen($valueOf) == 3) $valueOf = '0' . $valueOf;
elseif (strlen($valueOf) == 2) $valueOf = '00' . $valueOf;
elseif (strlen($valueOf) == 1) $valueOf = '000' . $valueOf;
return $valueOf; # currently outputs 5837
Java 源代碼中有哪些我的 PHP 代碼丟失了?
uj5u.com熱心網友回復:
問題是由以下差異引起的:
- 在 Java 中,String 操作
charAt以整數型別回傳結果char,它是從 0 到 65535 的無符號整數。 - 在 PHP 中,字串索引操作
[]將結果作為字符回傳。
因此,在Java 中this.input.charAt(0)回傳一個ASCII 碼'F',即70。在PHP 中$input[0]回傳一個字符'F',它不能直接轉換為int。因此,在 PHP(int)('F')中只是 0。為了在 PHP 中獲取符號的 ASCII 碼,請使用ord(). 例如:
$input = "F999"; # should output 2360
$charAt = (((ord($input[0]) * 5) * 2) - 698) ord($input[1]);
$charAt2 = ((((ord($input[2]) * 5) * 2) $charAt) ord($input[3])) - 528;
$charAt2 = (($charAt2 << 3) - $charAt2) % 100;
$valueOf = strval(((((((259 % $charAt) % 100) * 5) * 5) * 4) (((($charAt2 % 10) * 5) * 2) ((int) floor((double) ($charAt2 / 10))))));
if (strlen($valueOf) == 3) $valueOf = '0' . $valueOf;
elseif (strlen($valueOf) == 2) $valueOf = '00' . $valueOf;
elseif (strlen($valueOf) == 1) $valueOf = '000' . $valueOf;
return $valueOf;
這是一個演示。
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/412189.html
標籤:
上一篇:找到一個矩形和一個圓的交點
