একটি ফ্লোট 64 কে একটি ইন-তে রূপান্তর করুন


124

কীভাবে একজন ফ্লোট 64 এ গো-তে কোনও রূপান্তর করতে পারে? আমি জানি strconvপ্যাকেজটি স্ট্রিংতে বা কোনও কিছুতে রূপান্তর করতে ব্যবহার করা যেতে পারে, তবে ডেটা টাইপের মধ্যে নয় যেখানে স্ট্রিং নয়। আমি জানি যে আমি যে fmt.Sprintfকোনও কিছুকে স্ট্রিংয়ে রূপান্তর করতে ব্যবহার করতে পারি, এবং তারপরে strconvএটি আমার প্রয়োজন মতো ডেটা টাইপ করতে পারে তবে এই অতিরিক্ত রূপান্তরটি কিছুটা আনাড়ি বলে মনে হচ্ছে - এটি করার আরও ভাল উপায় আছে কি?


int(Round(f))একটি ফ্লোট 64 সেট করতে। স্ট্যাকওভারফ্লো . com/a/62753031/12817546 দেখুন । float64(i)একটি ফ্লোট 64 এ একটি int সেট করতে। স্ট্যাকওভারফ্লো . com/a/62737936/12817546 দেখুন ।
টম জে

উত্তর:


202
package main
import "fmt"
func main() {
  var x float64 = 5.7
  var y int = int(x)
  fmt.Println(y)  // outputs "5"
}

1
@ ডেভিড গ্রেসন, সুতরাং এই রূপান্তরটি ম্যাথ.ফ্লোয়ার (এক্স) এর মতই বা এটি ভাসা 64৪ স্মৃতিতে কীভাবে সংরক্ষণ করে?
ডেভিড লারসেন

3
@ ডেভিডলারসেন ফ্রম দ্য গো স্পেস: "ভাসমান-পয়েন্ট সংখ্যাটিকে পূর্ণসংখ্যায় রূপান্তর করার সময় ভগ্নাংশটি বাতিল হয়ে যায় (শূন্যের দিকে কাটা)"। (
বিশ্লেষণে

3
গোষ্ঠীতে এই জাতীয় ক্যাসেটগুলির একটি সমস্যা রয়েছে যা অপ্রত্যাশিত হতে পারে (কমপক্ষে আপনি জাভা থেকে আগত হলে): "ভাসমান-পয়েন্ট বা জটিল মানগুলির সাথে জড়িত সমস্ত ধ্রুবক রূপান্তরগুলিতে, যদি ফলাফলের ধরণের রূপান্তর সাফল্যের সাথে মানটি উপস্থাপন করতে না পারে তবে ফলাফল মান বাস্তবায়ন নির্ভর। ( golang.org/ref/spec#Cversvers )। সুতরাং আপনি যদি একটি খুব বড় মান কার্যকরভাবে অসীম হিসাবে ব্যবহার করেন এবং আপনি এটিকে একটি int তে রূপান্তর করেন তবে ফলাফলটি অপরিজ্ঞাত হয় (জাভা থেকে আলাদা নয় যেখানে এটি পূর্ণসংখ্যার ধরণের সর্বোচ্চ মান)।
জান

12

কেবলমাত্র কোনও ইন্টিতে কাস্টিং ফ্লোটকে ছাঁটাই করে দেয়, যদি আপনার সিস্টেমটি অভ্যন্তরীণভাবে 2.0 কে 1.9999999999 হিসাবে উপস্থাপন করে তবে আপনি যা আশা করেন তা পাবেন না। বিভিন্ন প্রিন্টফ রূপান্তরগুলি এর সাথে ডিল করে এবং রূপান্তর করার সময় সংখ্যাকে সঠিকভাবে গোল করে। সুতরাং আরও সঠিক মান পেতে, রূপান্তরটি আপনার প্রথম প্রত্যাশার চেয়ে আরও জটিল:

package main

import (
    "fmt"
    "strconv"
)

func main() {
    floats := []float64{1.9999, 2.0001, 2.0}
    for _, f := range floats {
        t := int(f)
        s := fmt.Sprintf("%.0f", f)
        if i, err := strconv.Atoi(s); err == nil {
            fmt.Println(f, t, i)
        } else {
            fmt.Println(f, t, err)
        }
    }
}

গো প্লেগ্রাউন্ডে কোড


8

যদি এটি ভাসমান 64 থেকে ইনট পর্যন্ত হয় তবে এটি কাজ করা উচিত

package main

import (
    "fmt"
)

func main() {
    nf := []float64{-1.9999, -2.0001, -2.0, 0, 1.9999, 2.0001, 2.0}

    //round
    fmt.Printf("Round : ")
    for _, f := range nf {
        fmt.Printf("%d ", round(f))
    }
    fmt.Printf("\n")

    //rounddown ie. math.floor
    fmt.Printf("RoundD: ")
    for _, f := range nf {
        fmt.Printf("%d ", roundD(f))
    }
    fmt.Printf("\n")

    //roundup ie. math.ceil
    fmt.Printf("RoundU: ")
    for _, f := range nf {
        fmt.Printf("%d ", roundU(f)) 
    }
    fmt.Printf("\n")

}

func roundU(val float64) int {
    if val > 0 { return int(val+1.0) }
    return int(val)
}

func roundD(val float64) int {
    if val < 0 { return int(val-1.0) }
    return int(val)
}

func round(val float64) int {
    if val < 0 { return int(val-0.5) }
    return int(val+0.5)
}

আউটপুট:

Round : -2 -2 -2 0 2 2 2 
RoundD: -2 -3 -3 0 1 2 2 
RoundU: -1 -2 -2 0 2 3 3 

খেলার মাঠের কোডটি এখানে - https://play.golang.org/p/HmFfM6Grqh


গো এর একটি রাউন্ড ফাংশন রয়েছে আপনি সেই রাউন্ডগুলি নিকটতম পূর্ণসংখ্যার জন্য ব্যবহার করতে পারেন: গণিত R রাউন্ড (-64.99) আউটপুট -65।
এহোনারমন্ড

2

প্রকারের ডেটাগুলিকে int()রূপান্তর করতে আপনি ফাংশনটি ব্যবহার করতে পারেন । একইভাবে আপনি ব্যবহার করতে পারেনfloat64intfloat64()

উদাহরণ:

func check(n int) bool { 
    // count the number of digits 
    var l int = countDigit(n)
    var dup int = n 
    var sum int = 0 

    // calculates the sum of digits 
    // raised to power 
    for dup > 0 { 
        **sum += int(math.Pow(float64(dup % 10), float64(l)))** 
        dup /= 10 
    } 

    return n == sum
} 

2

সঠিক রাউন্ডিং সম্ভবত কাঙ্ক্ষিত।

সুতরাং গণিত.রাউন্ড () আপনার চটজলদি (!) বন্ধু। Fmt.Sprintf এবং strconv.Atois () এর সাথে পন্থাগুলি আমার পরীক্ষাগুলি অনুযায়ী ভাসমান values৪ টি মানের ম্যাট্রিক্সের সাথে সঠিকভাবে গোলকৃত মানগুলির মান হয়ে ওঠার জন্য 2 মাপের মাত্রা কমিয়ে দেয়।

package main
import (
    "fmt"
    "math"
)
func main() {
    var x float64 = 5.51
    var y float64 = 5.50
    var z float64 = 5.49
    fmt.Println(int(math.Round(x)))  // outputs "6"
    fmt.Println(int(math.Round(y)))  // outputs "6"
    fmt.Println(int(math.Round(z)))  // outputs "5"
}

গণিত.রাউন্ড () একটি ফ্ল্যাট 64 মান দেয় তবে পরে () এর পরে প্রয়োগ করা হয়েছে, আমি এখনও কোনও মিল খুঁজে পাইনি।

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