2012-02-23 50 views
6

Tôi đang cố gắng hiểu các phép tính bát phân và thập lục phân javascript. Tôi biết tôi có thể sử dụng parseInt(string, radix) để lấy giá trị Integer.Chuyển đổi số bát phân và số thập lục phân thành cơ số 10

Ví dụ: khi tôi thử điều này, tại sao các giá trị khác nhau?

var octal = parseInt('026', 8); 
var octal1 = parseInt('030', 8); 
alert(octal); //22 
alert(octal1); //24  

var hex = parseInt('0xf5', 16); 
var hex1 = parseInt('0xf8', 16); 
alert(hex); //245 
alert(hex1); //248 

Nhưng nếu tôi cố gắng lưu nó vào một mảng tại sao các câu trả lời khác nhau và không chính xác?

var x = new Array(026, 5, 0xf5, "abc"); 
var y = new Array(030, 3, 0xf8, "def"); 

alert('026 is ' + parseInt(x[0],8)); //18 
alert('0xf5 is ' + parseInt(x[2],16)); //581 
alert('030 is ' + parseInt(y[0],8)); //20 
alert('0xf8 is ' + parseInt(y[2],16)); //584 
+0

Bạn đang đúng. Phần đầu tiên là không cần thiết. 'alert (026)' sẽ sinh ra '22'. Làm thế nào về mảng? – theking963

+1

Lưu ý rằng 'var foo = new Array (...);' gần như không bao giờ được ưa thích hơn 'var foo = [...];' vì trước đây là byte, chậm hơn và hàm tương đương. – Phrogz

Trả lời

6

parseInt chuyển đổi đối số chuỗi trước khi phân tích nó:

  1. Hãy inputString được ToString (string)

Vì vậy:

0x35.toString() // "53" 
parseInt("53", 16); //83 
parseInt(0x35, 16); //83 

Những gì bạn có trong mảng của bạn chủ yếu là các con số nên không cần phải phân tích chúng. Bạn sẽ nhận được kết quả mong đợi nếu bạn thay đổi chúng thành các chuỗi:

var x = new Array("026", "5", "0xf5", "abc"); 
var y = new Array("030", "3", "0xf8", "def"); 
0

0xf5 nhìn thấy bên ngoài một chuỗi số nguyên 245; nó không phải là một chuỗi mà cần phải được phân tích:

console.log("0xf5");    //-> 0xf5 
console.log(parseInt("0xf5",16)); //-> 245 
console.log(0xf5);    //-> 245 
console.log(parseInt(0xf5,16) ); //-> 581 
console.log(parseInt("245",16));  //-> 581 
console.log(parseInt(245,16) );  //-> 581 

Tương tự, 026 bên ngoài một chuỗi là số nguyên 22:

console.log(026);     //-> 22 

gì bạn đang làm là đi qua đã-chuyển-to-base10 số nguyên đến parseInt(), sau đó chuyển đổi chúng thành chuỗi và diễn giải base10 làm base16, thực hiện chuyển đổi cơ sở lần thứ hai.

+0

'026 === 22' không nhất thiết là một biểu thức hợp lệ trong EcmaScript 5 vì các số bát phân không phải là tiêu chuẩn. Xem [spec] (http://es5.github.com/#B.1.1) để biết chi tiết. –

1

Tôi đã viết một hàm có thể chuyển đổi một số từ cơ sở này sang cơ sở khác, nơi cơ sở bắt đầu và cơ số mới được chỉ định làm tham số.

function convertFromBaseToBase(str, fromBase, toBase){ 
    var num = parseInt(str, fromBase); 
    return num.toString(toBase); 
} 

alert(convertFromBaseToBase(10, 2, 10)); 

http://jsfiddle.net/jarble/p9ZLa/

Các vấn đề liên quan