সুইটে সুইট থেকে ফ্লোট রূপান্তর করুন


198

আমি একটি রূপান্তর করতে চান Floatএকটি থেকে Intসুইফট হবে। ভালো বেসিক ঢালাই অসদৃশ কাজ করে না, কারণ এই ধরনের না প্রিমিটিভের হয়, floats এবং intউদ্দেশ্য সি মধ্যে গুলি

var float: Float = 2.2
var integer: Int = float as Float

তবে এটি নিম্নলিখিত ত্রুটি বার্তা উত্পন্ন করে:

'ফ্লোট' 'ইনট' এ রূপান্তরযোগ্য নয়

কোন ধারণা কিভাবে থেকে সম্পত্তি রূপান্তর করতে Floatকরতে Int?


2
asঅপারেটর উপশ্রেণী নিচে ভোটদান জন্য। যেমন:UIView as UIButton
জ্যাক

2
দ্রুতগতিতে আপনি কীওয়ার্ড বা asচ্ছিক (যেমন?) যেমন 4 এর মতো ব্যবহার করে টাইপ কাস্টিং করতে পারেন? স্ট্রিং, 4 টি স্ট্রিং হতে পারে এটি কাজ করবে তবে এটি না থাকলে এটি কাজ করবে না। আমি এটি এনেছি কারণ আপনি আপনার প্রশ্নে "ingালাই" শব্দটি ব্যবহার করেছেন এবং আমি চাইনি যে আপনি বিভ্রান্ত হবেন। : 3
এশিয়া ডিকেন্স

আপনার কোডটি বোঝায় না। (ফ্লোট হিসাবে ভাসা) কিছুই করে না কারণ ফ্লোট ইতিমধ্যে ফ্লোট টাইপের। আপনি হয় বর্ণ পূর্ণসংখ্যার বোঝাতে চেয়েছিলেন: Int = float (একই ত্রুটি) বা var পূর্ণসংখ্যা: int = int হিসাবে float।
gnasher729

উত্তর:


317

আপনি সুইফটে এর মত রূপান্তর Floatকরতে পারেন Int:

var myIntValue:Int = Int(myFloatValue)
println "My value is \(myIntValue)"

আপনি @ পলমের মন্তব্য সহ এই ফলাফলটি অর্জন করতে পারেন:

var myIntValue = Int(myFloatValue)

@ পলম - আমি চেষ্টা করিনি (মন্তব্যে উপরের কোড) । তবে এটি আমাদের পক্ষে কাজ করবে (নিশ্চিত নয়)
আইপ্যাটেল

4
পরিবর্তনশীল প্রকারটি অন্তর্নিহিত করার জন্য কাস্টটি সুইফ্ট সংকলকটির পক্ষে যথেষ্ট, সুতরাং আপনার স্পষ্টভাবে প্রকারটি ঘোষণা করার দরকার নেই। var myIntValue = Int(myFloatValue)কাজ করে।
টিম সুলিভান

(সুইফট ২.০) আমার ফ্লোভালভ্যালু.আইএসফিনেট if ...}
ZYiOS

116

সুস্পষ্ট রূপান্তর

ইন্টে রূপান্তর করা কোনও নির্ভুলতা হারাবে (কার্যকরভাবে গোলাকার)। গণিতের লাইব্রেরিগুলিতে অ্যাক্সেস করে আপনি সুস্পষ্ট রূপান্তর সম্পাদন করতে পারেন। উদাহরণ স্বরূপ:

আপনি যদি গোলটি করে পূর্ণসংখ্যায় রূপান্তর করতে চান:

let f = 10.51
let y = Int(floor(f))

ফলাফল 10।

আপনি চেয়েছিলেন ধরপাকড় এবং পূর্ণসংখ্যা রূপান্তর:

let f = 10.51
let y = Int(ceil(f))

ফলাফল 11।

আপনি যদি সুস্পষ্টভাবে নিকটতম পূর্ণসংখ্যার সাথে গোল করতে চান

let f = 10.51
let y = Int(round(f))

ফলাফল 11।

পরবর্তী ক্ষেত্রে, এটি পেডেন্টিক বলে মনে হতে পারে তবে কোনও অন্তর্নিহিত রূপান্তর না থাকায় এটি শব্দার্থগতভাবে পরিষ্কার হয়েছে ... উদাহরণস্বরূপ যদি আপনি সিগন্যাল প্রক্রিয়াজাতকরণ করেন তবে গুরুত্বপূর্ণ।


3
হ্যাঁ, এটি সত্যিই লক্ষ্য করার মতো যে ইনট () কেবল ভগ্নাংশের অংশটি কেটে দেয় যা সাধারণত পছন্দসই আচরণ নয়;) ইন্টার (গোল (চ)) কাজটি করে।
গ্রজেগোর্জ ডি

1
অথবা সিল () মানটিকে উপরের দিকে গোল করতে।
ভিনসেন্ট

এজ কেস:round(10.5) == 11.0
#Maxence

26

রূপান্তর সহজ:

let float = Float(1.1) // 1.1
let int = Int(float) // 1

তবে এটি নিরাপদ নয়:

let float = Float(Int.max) + 1
let int = Int(float)

একটি দুর্দান্ত ক্রাশের কারণে হবে:

fatal error: floating point value can not be converted to Int because it is greater than Int.max

সুতরাং আমি একটি এক্সটেনশন তৈরি করেছি যা ওভারফ্লো পরিচালনা করে:

extension Double {
    // If you don't want your code crash on each overflow, use this function that operates on optionals
    // E.g.: Int(Double(Int.max) + 1) will crash:
    // fatal error: floating point value can not be converted to Int because it is greater than Int.max
    func toInt() -> Int? {
        if self > Double(Int.min) && self < Double(Int.max) {
            return Int(self)
        } else {
            return nil
        }
    }
}


extension Float {
    func toInt() -> Int? {
        if self > Float(Int.min) && self < Float(Int.max) {
            return Int(self)
        } else {
            return nil
        }
    }
}

আমি আশা করি এটি কারও সাহায্য করতে পারে


26

নির্ভুলতার সাথে সংখ্যার গোল করার অনেকগুলি উপায় রয়েছে। শেষ পর্যন্ত আপনার rounded()পছন্দসই নির্ভুলতা সহ ফ্লোট নম্বরটি রাউন্ডে সুইফ্টের মানক গ্রন্থাগার পদ্ধতি ব্যবহার করা উচিত ।

রাউন্ডে আপ ব্যবহার .upনিয়ম:

let f: Float = 2.2
let i = Int(f.rounded(.up)) // 3

ব্যবহারের নিয়মকে গোল করতে.down :

let f: Float = 2.2
let i = Int(f.rounded(.down)) // 2

নিকটতম পূর্ণসংখ্যার ব্যবহারের .toNearestOrEvenনিয়মে গোল করতে :

let f: Float = 2.2
let i = Int(f.rounded(.toNearestOrEven)) // 2

নিম্নলিখিত উদাহরণ সম্পর্কে সচেতন হন:

let f: Float = 2.5
let i = Int(roundf(f)) // 3
let j = Int(f.rounded(.toNearestOrEven)) // 2

5

এটার মত:

var float:Float = 2.2 // 2.2
var integer:Int = Int(float) // 2 .. will always round down.  3.9 will be 3
var anotherFloat: Float = Float(integer) // 2.0

5

পূর্ণসংখ্যা আরম্ভকারী পদ্ধতিতে ভাসমানটি পাস করে আপনি আপনার ভাসানের একটি পূর্ণসংখ্যার প্রতিনিধিত্ব পেতে পারেন।

উদাহরণ:

Int(myFloat)

মনে রাখবেন, দশমিক পয়েন্টের পরে যে কোনও সংখ্যা হ্রাস পাবে। অর্থ, 3.9 3 এর একটি আন্ত এবং 8.99999 8 এর পূর্ণসংখ্যা।


7
এবং রাউন্ডিংয়ের জন্য ইন্টার (মাইফ্লোট + .5) ব্যবহার করুন।
জিন লে মাইগানান


1

আপনি এটির মতো কাস্ট টাইপ করতে পারেন:

 var float:Float = 2.2
 var integer:Int = Int(float)

1

কেবল টাইপ কাস্টিং ব্যবহার করুন

 var floatValue:Float = 5.4
 var integerValue:Int = Int(floatValue)

 println("IntegerValue = \(integerValue)")

এটি রাউন্ডঅফ মানটি দেখায় যেমন: পূর্ণসংখ্যা = 5 এর দশমিক পয়েন্ট হ্রাস পাবে




0

মনে করুন আপনি ফ্লোট ভ্যালু এতে "X"সঞ্চয় করেছেন এবং আপনি পূর্ণসংখ্যার মানটি স্টোরেজ করছেন "Y"

Var Y = Int(x);

অথবা

var myIntValue = Int(myFloatValue)

-1

Int64পরিবর্তে ব্যবহার করুন IntInt64বৃহত্তর int মানগুলি সংরক্ষণ করতে পারে।


আপনি বলতে চাইছেন, মূল প্রশ্নের জন্য, বা এর Floatচেয়ে বড় মানের সীমাটি নিয়ে সমস্যা আছে Int?
বেনক করুন
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.