2010-12-09 6 views
8

मुझे एक आईओटी डेटाटाइप में संग्रहीत डेटा में फ्लोट डेटाटाइप में संग्रहीत कुछ डेटा को परिवर्तित करने में कुछ समस्याएं आ रही हैं।एसक्यूएल फ्लोट को एसक्यूएल आईएनटी में कनवर्ट करना, खो गया डेटा

DECLARE @data TABLE 
(
id INT, 
weight FLOAT 
) 
INSERT INTO @data VALUES(1,0.015662) 

SELECT CAST(weight * 1000000 AS INT) FROM @data 
SELECT 0.015662 * 1000000 
SELECT CAST(0.015662 * 1000000 AS INT) 

वांछित परिणाम होगा:: ID = 1 VALUE = 15662 लेकिन जब @data तालिका से आ रही है, मैं इस पाने के लिए नहीं लग रहे नीचे दिए गए उदाहरण मेरी समस्या को दिखाता है। इसके बजाय मुझे ID = 1 VALUE = 15661.

क्या किसी को भी कोई विचार है कि यह क्यों है? मैं अनुमान लगा रहा हूं कि यह किसी प्रकार की फ्लोट न्युअंस है। लेकिन मैंने कभी नहीं सोचा था कि उपरोक्त की तरह कुछ समस्या होगी। कोई विचार? आपकी सहायता के लिये पहले से ही धन्यवाद।

उत्तर

16

यह क्लासिक (int)((0.1+0.7)*10) समस्या है। चूंकि फ्लोट्स के मनमाने ढंग से परिशुद्धता होती है, इसलिए बहुत आसान मामलों के लिए भी int को कास्टिंग करते समय कुछ डेटा हानि संभव होती है।

इसके बजाय ROUND(weight * 1000000.0, 0) का उपयोग करें।

+0

राउंड (वजन * 1000000.0, 0) बेहतर होगा क्योंकि हम नहीं जानते कि कौन सी सिस्टम लेखक उपयोग करता है। – Lex

0

कंप्यूटर पर फ्लोट की विशिष्टता के कारण फ्लोट डेटा प्रकार के लिए यह सामान्य व्यवहार है। दशमलव बिंदु के बाद दशमलव अंकों (दशमलव) डेटा प्रकार का उपयोग करें। उदाहरण के लिए, दशमलव (10, 6)।

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