2014-09-23 14 views
8

xem xét mẫu mã sau:Tại sao Java 8 Nashorn (JavaScript) modulo trả về 0.0 (gấp đôi) thay vì 0 (số nguyên)?

import javax.script.ScriptEngine; 
import javax.script.ScriptEngineManager; 

public class Tester { 

    public static void main(String[] args) throws Exception { 
     ScriptEngine se = new ScriptEngineManager().getEngineByName("nashorn"); 

     Object eval = se.eval("5%5"); 

     System.out.println("eval = " + eval); 
     System.out.println("eval.getClass() = " + eval.getClass()); 
    } 
} 

Tại sao nó tạo ra đầu ra sau đây?

eval = 0,0
eval.getClass() = lớp java.lang.Double

Kiểu kết quả là java.lang.Double đó là lạ.

Trong trường hợp số dư còn lại khác 0 thì trả về chính xác java.lang.Integer, ví dụ: 5%2 trả về java.lang.Integer' with value 1`.

Chỉ 0 bằng cách nào đó là đặc biệt.

Đang cố gắng biểu thức JavaScript cùng trong Firefox 32.0.2 (FindBugs console) hoạt động tốt và trả về đồng bằng 0.

Có cách nào để buộc Nashorn trở Integer loại thay vì đúp?

+1

JavaScript chỉ có loại số nổi. – Teemu

+0

@Teemu cảm ơn thông tin của bạn, nhưng tại sao nó lại quan trọng ở đây? Bên trong nó có thể là một phao, nhưng bằng cách nào đó nó có thể 'đúc' nó thành số nguyên, ví dụ: '5% 2' tạo ra số nguyên 1. Tôi sẽ chấp nhận lời giải thích như vậy nếu tôi nhận được 1.0 trong trường hợp này. –

+0

Firefox không phải là "truyền" bất cứ thứ gì. Nó chỉ là vấn đề làm thế nào nó hiển thị giá trị dấu phẩy động 1.0. –

Trả lời

5

Không có số nguyên nào trong JavaScript.

Bắt đầu với ECMAScript Section 8: Types:

loại ngôn ngữ

Các ECMAScript là Undefined, Null, Boolean, String, Number, và Object.

Sau đó thấy ECMAScript Section 8.5: The Number Type:

The Number loại có chính xác 18437736874454810627 (có nghĩa là, 264-253 + 3) giá trị, đại diện cho hai chính xác định dạng 64-bit IEEE 754 giá trị. .. "(nhấn mạnh thêm)

Thực tế Firefox hiển thị giá trị dấu phẩy động 1 là" 1 "thay vì" 1.0 "không liên quan và gây nhầm lẫn cho bạn.

+1

Cảm ơn câu trả lời. Hãy quên Firefox vì tôi đồng ý nó có thể gây nhầm lẫn. Hãy chỉ tập trung vào Nashorn mà nên thực hiện các ECMAScript LS. Đôi khi nó là 'java.lang.Integer' và đôi khi nó là' java.lang.Double'. –

+1

Tuyệt vời: cảm ơn bạn đã thu hẹp câu hỏi cho câu hỏi đó ... Dưới đây là những gì tôi muốn nói: thật kỳ lạ khi nó trả về 'java.lang.Integer' vì tất cả các số JavaScript đều là dấu phảy động. Tôi sẽ xem liệu tôi có thể tìm ra phần đó không. Tôi muốn nói đó là một lỗi, có thể sẽ thay đổi trong các bản phát hành trong tương lai, và do đó tôi có thể bọc các thứ của tôi vào thứ gì đó chuyển đổi mọi thứ thành Double (không có Java API trước mặt tôi, nhưng mới Double() hoặc Double .valueOf() hoặc bất kỳ thứ gì). –

+2

Hoặc, để rõ ràng hơn, tôi muốn thay đổi câu hỏi từ "tại sao nó trả về Double thay vì Integer" thành "tại sao nó trả về Integer thay vì Double?" –

6

8u40 - cập nhật sắp tới - nguồn http://hg.openjdk.java.net/jdk8u/jdk8u-dev/nashorn khắc phục sự cố này. Điều đó nói rằng, tốt hơn là mong đợi kết quả kiểu "java.lang.Number" (trong giao diện Java) để tính toán số và chuyển đổi bằng cách sử dụng các phương thức java.lang.Number như intValue(), doubleValue(), v.v.

+0

Cảm ơn rất nhiều về đầu vào của bạn! Thật đáng tiếc, tôi không thể chấp nhận tất cả các bạn trả lời. Tôi đã chấp nhận câu trả lời của David khi anh ta đề xuất trước tiên đây là một lỗi và đào sâu vào mã nguồn. Tuy nhiên, cảm ơn một lần nữa. –

4

là những gì các Nashorn docs phải nói về việc chuyển giá trị số từ hoạt Javascript để Java:

nếu loại mục tiêu là ít cụ thể (ví dụ, số), bạn chỉ có thể mong đợi họ là kiểu Number, ... Số có thể là bất kỳ loại được đóng hộp nào do tối ưu hóa nội bộ

Như những người khác đã chỉ ra Ja Bản thân vaScript chỉ hỗ trợ các giá trị dấu phẩy động (loại Number).

+0

Cảm ơn rất nhiều vì điều này "Con số có thể là bất kỳ loại đóng hộp nào do tối ưu hóa nội bộ" một phần! –

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