2016-04-25 7 views
6

के साथ काम नहीं कर रहा है हमने ओरेकल जेडीके 8u77 से 8u92 तक अपग्रेड किया और अचानक स्क्रिप्ट जो पहले काम नहीं कर रही थीं। एक न्यूनतम प्रतिलिपि प्रस्तुत है:नैशर्न अब बिगडेसिमल

Map<String, Object> attributes = Collections.singletonMap("GROSSREIMBAMOUNT", BigDecimal.ZERO); 
String script = "GROSSREIMBAMOUNT.toFixed(2)"; 

ScriptEngineManager mgr = new ScriptEngineManager(); 
ScriptEngine jsEngine = mgr.getEngineByName("JavaScript"); 

for (Entry<String, Object> entry : attributes.entrySet()) { 
    jsEngine.put(entry.getKey(), entry.getValue()); 
} 

System.out.println(jsEngine.eval(script)); 

पहले हम

0.00 

मिला लेकिन अब हम हो रही है।

TypeError: GROSSREIMBAMOUNT.toFixed is not a function 

typeof अब object रिटर्न जहां यह पहले से number लौट आते हैं।

मेरा प्रश्न यह व्यवहार जानबूझकर या बग है? मैं सबसे पहले यह एक बग होगा लेकिन JDK-8010732 अन्यथा सुझाव देना प्रतीत होता है।

उत्तर

7

नैशर्न की प्रारंभिक रिलीज ने सभी संख्यात्मक जावा प्राइमेटिव्स और java.lang.Number के सभी उप-वर्गों को जावास्क्रिप्ट नंबर के रूप में माना। हालांकि, जावास्क्रिप्ट संख्या को युगल के रूप में परिभाषित किया गया है, और इसका मतलब है कि संख्यात्मक प्रकार जो लंबे समय तक या java.lang.BigDecimals को युगल करने के लिए मानचित्र नहीं करते हैं, जावास्क्रिप्ट नंबर में परिवर्तित होने पर सटीकता के नुकसान से ग्रस्त होंगे।

जैसा कि आपने देखा, हमने इसे 8u77 और 8u92 के बीच तय किया। Java.lang.Number के उदाहरण जिन्हें युगल में साफ रूप से मैप नहीं किया जा सकता है अब नास्टर्न में जावास्क्रिप्ट नंबर के रूप में नहीं माना जाता है।

आपके पास इसके आसपास काम करने के लिए दो विकल्प हैं। एक इन्हें केवल जावा ऑब्जेक्ट्स के रूप में इन नंबरों का इलाज करना है और जावा क्लास द्वारा प्रदान की गई विधियों का उपयोग करना है। आमतौर पर यह बेहतर विकल्प होता है क्योंकि जावा क्लास को संख्यात्मक प्रकार के साथ काम करने के लिए लिखा गया था। दूसरा विकल्प स्पष्ट रूप से जावास्क्रिप्ट नंबर में कनवर्ट करना है। यह आम तौर पर "नया" कीवर्ड के बिना वैश्विक नंबर() कन्स्ट्रक्टर को कॉल करके या यूनरी "+" ऑपरेटर को प्रीपेड करके किया जाता है। ध्यान दें कि इस रूपांतरण के परिणामस्वरूप बिना किसी ध्यान के परिशुद्धता का नुकसान हो सकता है, इसलिए पहला विकल्प शायद सुरक्षित पथ है।

+0

मुझे जेडीके 8 रिलीज नोट्स में इसका कोई उल्लेख नहीं मिला। @ हेंस-वॉलनोफर द्वारा संदर्भित बग https://bugs.openjdk.java.net/browse/JDK-8146264 है –

संबंधित मुद्दे