ডাবল মানকে দ্রাঘিমাংশে দশমিক স্থানে স্ফিটের দশমিক মানের


395

যে কেউ আমাকে কীভাবে বলতে পারবেন যে কীভাবে দ্বিগুণ মানটিকে সুইফটে দশমিক স্থানের দশমিক স্থানে গোল করতে হবে?

আমার আছে:

var totalWorkTimeInHours = (totalWorkTime/60/60)

totalWorkTimeদ্বিতীয়টিতে NSTimeInterval (ডাবল) হওয়ার সাথে ।

totalWorkTimeInHours আমাকে ঘন্টা দেবে, তবে এটি আমাকে এত দীর্ঘ সুনির্দিষ্ট সংখ্যায় যেমন 1.543240952039 সময় দেয় ......

আমি মুদ্রণ করার সময় 1.543 এ কীভাবে বলব totalWorkTimeInHours?


1
দেখুন আমার উত্তর একটি ডবল ডারউইন ব্যবহার সুসম্পন্ন পর্যন্ত 9 বিভিন্ন উপায়ে এটি round(_:), Double round(), NSStringসূচনাকারী, Stringসূচনাকারী, NumberFormatter, ডাবল এক্সটেনশন বা এমনকি NSDecimalNumberএবং Decimal
ইমানু পেটিট

: @Rounded, একটি দ্রুতগতি 5.1 সম্পত্তি মোড়কের gist.github.com/abhijithpp/1cc41b41a5d1c8f007da90f20bc0c65f
Abhijith

উত্তর:


389

roundএটি সম্পাদন করতে আপনি সুইফটের ফাংশনটি ব্যবহার করতে পারেন ।

Double3 টি সংখ্যার যথার্থতার সাথে গোল করতে , প্রথমে এটি 1000 দ্বারা গুণিত করুন এবং এটির বৃত্তাকার ফলাফলটি 1000 দ্বারা ভাগ করুন:

let x = 1.23556789
let y = Double(round(1000*x)/1000)
print(y)  // 1.236

কোনও ধরণের printf(...)বা String(format: ...)সমাধান ব্যতীত, এই অপারেশনের ফলাফল এখনও প্রকারের Double

সম্পাদনা:
মন্তব্যগুলি যে এটি কখনও কখনও কার্যকর হয় না সম্পর্কিত বিষয়ে, দয়া করে এটি পড়ুন:

প্রতিটি প্রোগ্রামার ভাসমান-পয়েন্ট পাটিগণিত সম্পর্কে যা জানা উচিত


কিছু কারণে এটি সাহায্য করে না .. আমি নিম্নলিখিত ক্ষেত্রে ট্রান্সফর্মফু <<ডাবল, স্ট্রিং> (জেএসএন) থেকে এটি ব্যবহার করছি: {ডাবল (গোল (($ 0! এনএসএসটিং হিসাবে)) {"($ 0)"})
ফোকস

29
খেলার মাঠে আমার পক্ষে কাজ করে না: let rate = 9.94999999999; Double(round(rate * 100) / 100);আউটপুট: 9.94999999999, 9.949999999999999কেবল মুদ্রণের জন্য কাজ করে তবে আমি কীভাবে এটিকে পরিবর্তনশীল হিসাবে নির্ধারণ করতে পারি?
আলেকজান্ডার ইয়াকোলেভ

এর জন্য আপনার দশমিক ব্যবহার করা উচিত, সাধারণ দ্বিগুণ নয়।
সিএসটিরিউ

13
"প্রতিটি কম্পিউটার বিজ্ঞানী কী ভাসমান-পয়েন্ট গাণিতিক সম্পর্কে জানা উচিত" 73 পৃষ্ঠার দীর্ঘ is টিএল; ডিআর কী? :)
জারেডএইচ

1
@ হার্ডিকডিজি আমার মনে নেই, দুঃখিত :-)
আলেকজান্ডার ইয়াকোভ্লেভ

430

সুইফট 2 এর জন্য এক্সটেনশন

আরও সাধারণ সমাধান নিম্নলিখিত এক্সটেনশন যা সুইফট 2 এবং আইওএস 9 এর সাথে কাজ করে:

extension Double {
    /// Rounds the double to decimal places value
    func roundToPlaces(places:Int) -> Double {
        let divisor = pow(10.0, Double(places))
        return round(self * divisor) / divisor
    }
}


সুইফট 3 এর জন্য এক্সটেনশন

সুইফ্ট 3 roundএ প্রতিস্থাপন করা হয় rounded:

extension Double {
    /// Rounds the double to decimal places value
    func rounded(toPlaces places:Int) -> Double {
        let divisor = pow(10.0, Double(places))
        return (self * divisor).rounded() / divisor
    }
}


উদাহরণস্বরূপ যা 4 টি দশমিক স্থানে ডাবল গোল করে:

let x = Double(0.123456789).roundToPlaces(4)  // x becomes 0.1235 under Swift 2
let x = Double(0.123456789).rounded(toPlaces: 4)  // Swift 3 version

17
সুইফ্টের দ্বিগুণ প্রকৃতিটি প্রদর্শিত হয় যে এটি অনর্থক হতে পারে - কারণ এটি বাইনারিটিতে যেভাবে সঞ্চিত / অ্যাক্সেস করা হয়েছে, এমনকি এই বৃত্তাকার ফাংশনটি ব্যবহার করে 3 টি দশমিক স্থানে গোল করে কোনও সংখ্যা ফেরত আসবে না: যেমন, round(8.46 * pow(10.0, 3.0)) / pow(10.0, 3.0)রিটার্ন 8.460000000000001। ভাসা দিয়েও একই কাজ,কমপক্ষে এই কাজ করা বাস্তবে কার্যকর বলে মনে হয়: round(Float(8.46) * pow(10.0, 3.0)) / pow(10.0, 3.0)ফলন দেয় 8.46। শুধু লক্ষ্য করার মতো কিছু
বেন সাফলে

2
দুর্ভাগ্যবশত, এই আর সুইফট 3 কাজ করে, আমি এই ত্রুটি পাচ্ছিNo '*' candidates produce the expected contextual result type 'FloatingPointRoundingRule'
Koen

2
আমি সমাধানটি আপডেট করেছি এবং সুইফট 3 এর জন্য একটি এক্সটেনশন যুক্ত করেছি।
সেবাস্তিয়ান

2
আরও দ্রুত 3 হতে ... আপনাকে ফানক গোলাকার জন্য স্থান পরিবর্তন করতে হবে (টু প্লেসেস জায়গা: আন্ত) -> ডাবল
ফুজ

2
@ বেনসফলি কিন্তু আপনি 98.68 প্রবেশ করালে এটি কাজ করে না। এই ক্ষেত্রে, আমি 98.6800003 পাই
আলেকজান্ডার খিতেভ

340

আমি মুদ্রণ করার সময় 1.543 এ কীভাবে বলব totalWorkTimeInHours?

রাউন্ডে totalWorkTimeInHoursমুদ্রণের জন্য 3 সংখ্যার জন্য ব্যবহারString কনস্ট্রাক্টরটি যা একটি formatস্ট্রিং নেয় :

print(String(format: "%.3f", totalWorkTimeInHours))

24
এটি কাটা, গোল নয়
আইবোল

33
@ আইবল: আসলে, এটি গোলাকার হয়। এটি সি প্রিন্টফ কার্যকারিতার মতো একই আচরণ, যা অনুরোধকৃত অঙ্কগুলিতে গোল করে। তাই String(format: "%.3f", 1.23489)প্রিন্টস1.235
zisoft

6
আসল পোস্টারটি ব্যবহারের জন্য একটি সংখ্যাসূচক মান খুঁজছেন, প্রদর্শিত স্ট্রিংটি নয়।
pr1001

17
@ pr1001, সম্ভবত তাই, তবে এটি তখন পরিষ্কার ছিল না এবং 46 জন আমার উত্তরকে দরকারী বলে মনে করেছে। স্টকে ওভারফ্লো কেবল ওপিকে সহায়তা করার চেয়ে আরও বেশি কিছু।
ভ্যাকোয়াম

3
বিজোড়, এটি প্রতিবার 0.00 ফিরছে।
এরিক এইচ

254

আপনার প্রয়োজন অনুসারে সুইফ্ট 5 এর সাহায্যে, এ থেকে গোলাকৃত ফলাফল পেতে আপনি নীচের 9 টি শৈলীর একটি চয়ন করতে পারেন Double


# 1। FloatingPoint rounded()পদ্ধতি ব্যবহার

সবচেয়ে সহজ ক্ষেত্রে, আপনি Double rounded()পদ্ধতিটি ব্যবহার করতে পারেন ।

let roundedValue1 = (0.6844 * 1000).rounded() / 1000
let roundedValue2 = (0.6849 * 1000).rounded() / 1000
print(roundedValue1) // returns 0.684
print(roundedValue2) // returns 0.685

# 2। FloatingPoint rounded(_:)পদ্ধতি ব্যবহার

let roundedValue1 = (0.6844 * 1000).rounded(.toNearestOrEven) / 1000
let roundedValue2 = (0.6849 * 1000).rounded(.toNearestOrEven) / 1000
print(roundedValue1) // returns 0.684
print(roundedValue2) // returns 0.685

# 3। ডারউইন roundফাংশন ব্যবহার করে

ফাউন্ডেশন roundডারউইনের মাধ্যমে একটি ফাংশন সরবরাহ করে।

import Foundation

let roundedValue1 = round(0.6844 * 1000) / 1000
let roundedValue2 = round(0.6849 * 1000) / 1000
print(roundedValue1) // returns 0.684
print(roundedValue2) // returns 0.685

# 4। Doubleডারউইন roundএবং powফাংশনগুলিতে নির্মিত এক্সটেনশন কাস্টম পদ্ধতি ব্যবহার করে

আপনি যদি পূর্বের ক্রিয়াকলাপটি অনেকবার পুনরাবৃত্তি করতে চান তবে আপনার কোডটি রিফ্যাক্ট করা ভাল ধারণা হতে পারে।

import Foundation

extension Double {
    func roundToDecimal(_ fractionDigits: Int) -> Double {
        let multiplier = pow(10, Double(fractionDigits))
        return Darwin.round(self * multiplier) / multiplier
    }
}

let roundedValue1 = 0.6844.roundToDecimal(3)
let roundedValue2 = 0.6849.roundToDecimal(3)
print(roundedValue1) // returns 0.684
print(roundedValue2) // returns 0.685

# 5। NSDecimalNumber rounding(accordingToBehavior:)পদ্ধতি ব্যবহার

যদি প্রয়োজন হয়, NSDecimalNumberদশমিক সংখ্যার বৃত্তাকার জন্য একটি ভার্বোস তবে শক্তিশালী সমাধান সরবরাহ করে।

import Foundation

let scale: Int16 = 3

let behavior = NSDecimalNumberHandler(roundingMode: .plain, scale: scale, raiseOnExactness: false, raiseOnOverflow: false, raiseOnUnderflow: false, raiseOnDivideByZero: true)

let roundedValue1 = NSDecimalNumber(value: 0.6844).rounding(accordingToBehavior: behavior)
let roundedValue2 = NSDecimalNumber(value: 0.6849).rounding(accordingToBehavior: behavior)

print(roundedValue1) // returns 0.684
print(roundedValue2) // returns 0.685

# 6। NSDecimalRound(_:_:_:_:)ফাংশন ব্যবহার করে

import Foundation

let scale = 3

var value1 = Decimal(0.6844)
var value2 = Decimal(0.6849)

var roundedValue1 = Decimal()
var roundedValue2 = Decimal()

NSDecimalRound(&roundedValue1, &value1, scale, NSDecimalNumber.RoundingMode.plain)
NSDecimalRound(&roundedValue2, &value2, scale, NSDecimalNumber.RoundingMode.plain)

print(roundedValue1) // returns 0.684
print(roundedValue2) // returns 0.685

# 7। NSString init(format:arguments:)ইনিশিয়ালাইজার ব্যবহার করে

আপনি যদি NSStringআপনার রাউন্ডিং অপারেশন থেকে কোনও ফিরে আসতে চান NSStringতবে ইনিশিয়ালাইজার ব্যবহার করা একটি সহজ তবে দক্ষ সমাধান।

import Foundation

let roundedValue1 = NSString(format: "%.3f", 0.6844)
let roundedValue2 = NSString(format: "%.3f", 0.6849)
print(roundedValue1) // prints 0.684
print(roundedValue2) // prints 0.685

# 8। String init(format:_:)ইনিশিয়ালাইজার ব্যবহার করে

Stringফাউন্ডেশনের NSStringশ্রেণিতে সুইফটের ধরণটি ব্রিজ করা হয় । সুতরাং, Stringআপনার রাউন্ডিং অপারেশন থেকে কোনও ফিরে আসতে আপনি নিম্নলিখিত কোডটি ব্যবহার করতে পারেন :

import Foundation

let roundedValue1 = String(format: "%.3f", 0.6844)
let roundedValue2 = String(format: "%.3f", 0.6849)
print(roundedValue1) // prints 0.684
print(roundedValue2) // prints 0.685

# 9। ব্যবহারNumberFormatter

আপনি যদি String?আপনার রাউন্ডিং অপারেশন থেকে একটি পাওয়ার প্রত্যাশা করেন তবে NumberFormatterএকটি অত্যন্ত কাস্টমাইজযোগ্য সমাধান দেয়।

import Foundation

let formatter = NumberFormatter()
formatter.numberStyle = NumberFormatter.Style.decimal
formatter.roundingMode = NumberFormatter.RoundingMode.halfUp
formatter.maximumFractionDigits = 3

let roundedValue1 = formatter.string(from: 0.6844)
let roundedValue2 = formatter.string(from: 0.6849)
print(String(describing: roundedValue1)) // prints Optional("0.684")
print(String(describing: roundedValue2)) // prints Optional("0.685")

1
দুর্দান্ত উত্তর। আমি # 5 এ পরামর্শ দিতে পারি যে আপনি ব্যবহারের বিষয়ে বিবেচনা করতে পারেন Decimal, যা টোল ফ্রি ব্রিজড NSDecimalNumberDecimalমত নেটিভ অপারেটরদের জন্য সুইফট এর নেটিভ টাইপ এবং অফার আরো মার্জিত সমর্থন +, -ইত্যাদি
রব

@ রব আমি আমার উত্তরটি NSDecimalRound(_:_:_:_:)ফাংশন সহ আপডেট করেছি । ধন্যবাদ।
ইমানু পেটিট

# 9 টি পছন্দ ব্যবহার করা আপনাকে গ্যারান্টি দিবে যে আপনি স্থির ভগ্নাংশ (যথার্থ অঙ্কের সংখ্যা) আশা করবেন, দশমিক সংখ্যা 43.12345 এবং ভগ্নাংশ = 6 বলুন, আপনি 43.123450 পান
আলমাস আদিলবেক

1
@ ইমানউপেট এই পোস্ট করার জন্য আপনাকে ধন্যবাদ। আমি কয়েকটা এক্সটেনশান কমিয়ে দিতে পারি।
অ্যাড্রিয়ান

আমি দু: খিত NumberFormatterহ'ল শেষ বিকল্পটি যখন এটি ব্যবহারকারীর কাছে সংখ্যা উপস্থাপনের জন্য প্রথম হওয়া উচিত। অন্য কোনও পদ্ধতি সঠিকভাবে স্থানীয়ভাবে সংখ্যা তৈরি করে না।
সুলতান


50

এটি একটি সম্পূর্ণ কাজ কোড

সুইফট 3.0 / 4.0 / 5.0, এক্সকোড 9.0 জিএম / 9.2 এবং তারপরে

let doubleValue : Double = 123.32565254455
self.lblValue.text = String(format:"%.f", doubleValue)
print(self.lblValue.text)

আউটপুট - 123

let doubleValue : Double = 123.32565254455
self.lblValue_1.text = String(format:"%.1f", doubleValue)
print(self.lblValue_1.text)

আউটপুট - 123.3

let doubleValue : Double = 123.32565254455
self.lblValue_2.text = String(format:"%.2f", doubleValue)
print(self.lblValue_2.text)

আউটপুট - 123.33

let doubleValue : Double = 123.32565254455
self.lblValue_3.text = String(format:"%.3f", doubleValue)
print(self.lblValue_3.text)

আউটপুট - 123.326


1
এক লাইন?, 3 লাইনের মতো মনে হচ্ছে;)
পিটার ফ্রিবার্গ

আপনি স্ট্রিং ব্যবহার করে জিনিস গণনা করতে পারবেন না, আমি এটির সঠিক উত্তর বলে মনে করি না কারণ এটি কেবল প্রদর্শনের জন্য।
জেবারোস 35

25

যোগীর উত্তরের ভিত্তিতে তৈরি করা, এখানে একটি সুইফট ফাংশন রয়েছে যা কাজটি করে:

func roundToPlaces(value:Double, places:Int) -> Double {
    let divisor = pow(10.0, Double(places))
    return round(value * divisor) / divisor
}

20

সুইফ্ট 3.0 এবং এক্সকোড 8.0 এ:

extension Double {
    func roundTo(places: Int) -> Double {
        let divisor = pow(10.0, Double(places))
        return (self * divisor).rounded() / divisor
    }
}

এই এক্সটেনশনটি এর মতো ব্যবহার করুন:

let doubleValue = 3.567
let roundedValue = doubleValue.roundTo(places: 2)
print(roundedValue) // prints 3.56

19

সুইফট 4, এক্সকোড 10

yourLabel.text =  String(format:"%.2f", yourDecimalValue)

1
আমি ডাউনভোট করি নি, তবে আমি মনে করি কারণ হতে পারে কারণ এটি কোনও সংখ্যার একটি স্ট্রিং প্রতিনিধিত্ব ফিরিয়ে দিচ্ছে, সংখ্যাটি নয়। কোনটি ঠিক যদি আপনার প্রয়োজন হয় তবে আপনি আরও ব্যবহারের জন্য নম্বরটি গোল করে নিতে চান। ওপি "যখন আমি প্রিন্ট করব" বলেছিল তাই আমি মনে করি এটি এই ক্ষেত্রে একটি গ্রহণযোগ্য, সহজ এবং পরিষ্কার সমাধান।
বেন স্টাহল

1
পারফেক্ট। এক লাইন সমাধান। আমার কেবলমাত্র আমার লেবেলে স্ট্রিং হিসাবে দশমিক মানগুলি দেখানো দরকার।
জিশান

18

দশমিকের পরে নির্দিষ্ট অঙ্কের কোডটি হ'ল:

var a = 1.543240952039
var roundedString = String(format: "%.3f", a)

এখানে% .3f দ্রুত এই সংখ্যাটি 3 দশমিক স্থানে পরিণত করতে বলেছে এবং আপনি যদি দ্বিগুণ সংখ্যা চান, আপনি এই কোডটি ব্যবহার করতে পারেন:

// স্ট্রিং টু ডাবল

var roundedString = Double(String(format: "%.3f", b))


14

বিল্ট ইন ফাউন্ডেশন ডারউইন লাইব্রেরি ব্যবহার করুন

সুইফট 3

extension Double {
    func round(to places: Int) -> Double {
        let divisor = pow(10.0, Double(places))
        return Darwin.round(self * divisor) / divisor
    }
}

ব্যবহার:

let number:Double = 12.987654321
print(number.round(to: 3)) 

আউটপুটস: 12.988


9

একটি সহজ উপায় ডাবল প্রকারের এক্সটেনশনের ব্যবহার হতে পারে

extension Double {
    var roundTo2f: Double {return Double(round(100 *self)/100)  }
    var roundTo3f: Double {return Double(round(1000*self)/1000) }
}

ব্যবহার:

let regularPie:  Double = 3.14159
var smallerPie:  Double = regularPie.roundTo3f  // results 3.142
var smallestPie: Double = regularPie.roundTo2f  // results 3.14

9

আপনি যদি Doubleমানগুলি গোল করতে চান তবে আপনি সুইফ্টটি ব্যবহার করতে চাইবেন Decimalযাতে এই বৃত্তাকার মানগুলির সাথে গণিত করার চেষ্টা করার সময় আপনি যে কোনও ত্রুটি কাটতে পারেন তা প্রবর্তন করবেন না। আপনি যদি ব্যবহারDecimal এটি সঠিকভাবে সেই বৃত্তাকার ভাসমান পয়েন্ট মানের দশমিক মান উপস্থাপন করতে পারে।

সুতরাং আপনি এটি করতে পারেন:

extension Double {
    /// Convert `Double` to `Decimal`, rounding it to `scale` decimal places.
    ///
    /// - Parameters:
    ///   - scale: How many decimal places to round to. Defaults to `0`.
    ///   - mode:  The preferred rounding mode. Defaults to `.plain`.
    /// - Returns: The rounded `Decimal` value.

    func roundedDecimal(to scale: Int = 0, mode: NSDecimalNumber.RoundingMode = .plain) -> Decimal {
        var decimalValue = Decimal(self)
        var result = Decimal()
        NSDecimalRound(&result, &decimalValue, scale, mode)
        return result
    }
}

তারপরে, আপনি এর Decimalমতো বৃত্তাকার মান পেতে পারেন:

let foo = 427.3000000002
let value = foo.roundedDecimal(to: 2) // results in 427.30

এবং যদি আপনি এটি নির্দিষ্ট সংখ্যক দশমিক স্থানে প্রদর্শন করতে চান (পাশাপাশি ব্যবহারকারীর বর্তমান লোকেলের জন্য স্ট্রিং স্থানীয়করণ করতে পারেন), আপনি এটি ব্যবহার করতে পারেন NumberFormatter:

let formatter = NumberFormatter()
formatter.maximumFractionDigits = 2
formatter.minimumFractionDigits = 2

if let string = formatter.string(for: value) {
    print(string)
}

2
এখন পর্যন্ত সেরা উত্তর।
কোডেটার্ড

(4.81).roundedDecimal(to: 2, mode: .down)4.81 এর পরিবর্তে 4.8 ফিরে আসবে, Decimal(string: self.description)!একটি সুনির্দিষ্ট জন্য ব্যবহার করুনdecimalValue
vk.edward.li

1
@ vk.edward.li - হ্যাঁ, দশমিকের উপরে / নিচে গোল করার বিষয়ে সতর্ক হওয়া উচিত, কারণ ৪.৮১ এর মতো মানগুলি Double(এটি হয়ে যায় 4.8099999999999996) দিয়ে সঠিকভাবে উপস্থাপন করা যায় না । তবে আমি ব্যবহারের বিরুদ্ধে পরামর্শ দেব description(যে গোলটি এটি নিযুক্ত করে তা নথিভুক্ত নয় এবং পরিবর্তিত হতে পারে)। আপনি কি সত্যিই দশমিক-নির্ভুল গণিত কাজ করা করতে চান তাহলে, আপনি এড়িয়ে চলা উচিত Doubleসম্পূর্ণরূপে এবং এর পরিবর্তে ব্যবহার করা উচিত Decimalসরাসরি (যেমন Decimal(sign: .plus, exponent: -2, significand: 481)অথবা Decimal(string: "4.81")কিন্তু ব্যবহার করবেন না। description
রব

@ রব সাধারণত "4.81" স্ট্রিংয়ের মান পাওয়া অসম্ভব যদি এটি ডাবল হিসাবে সংরক্ষণ করা হয়, সুতরাং আপনাকে ইতিমধ্যে হারিয়ে যাওয়া যথাযথতা ঠিক করার জন্য স্ব.ডেস্ক্রিপশন (একটি পরিবর্তিত গ্রিসু 2 অ্যালগরিদম) ব্যবহার করতে হবে
vk.edward.li

আমি আপনার বক্তব্য বুঝতে পারি। আমি কেবল আপনার সমাধানের সাথে একমত নই। descriptionপদ্ধতির বৃত্তাকারী আচরণটি নথিভুক্ত বা গ্যারান্টিযুক্ত নয়। এছাড়াও, এটি স্থানীয়ীকৃত নয়। আইএমএইচও, descriptionলগিংয়ের উদ্দেশ্য ব্যতীত অন্য কোনও কিছুর জন্য ব্যবহার করা ভুল । আমি হয় Decimalপুরো জুড়ে ব্যবহার করব, Doubleসম্পূর্ণরূপে ব্যবহার এড়িয়ে চলব, বা কেবল একটি ভিন্ন রাউন্ডিং মোড ব্যবহার করব। অথবা, যদি আপনার অবশ্যই হয় তবে আপনার নিজস্ব স্থানীয় পদ্ধতি ব্যবহার করুন যা গ্রিসু-স্টাইলের অ্যালগোরিদম ব্যবহার করে (তবে আপনি কতগুলি দশমিক স্থানে গোল করতে চান তা জানেন তবে এটি অপ্রয়োজনীয় মনে হয়)। তবে আমি এই আনুষাঙ্গিক আচরণের উপর নির্ভর করা এড়াতে চাই description
রব

8

এটি একটি দীর্ঘ পরিশ্রমের ধরণের যা আপনার প্রয়োজনগুলি আরও কিছুটা জটিল হলে কার্যকর হতে পারে। আপনি সুইফটে একটি নম্বর বিন্যাস ব্যবহার করতে পারেন।

let numberFormatter: NSNumberFormatter = {
    let nf = NSNumberFormatter()
    nf.numberStyle = .DecimalStyle
    nf.minimumFractionDigits = 0
    nf.maximumFractionDigits = 1
    return nf
}()

মনে করুন আপনার পরিবর্তনশীলটি আপনি মুদ্রণ করতে চান

var printVar = 3.567

এটি নিশ্চিত হয়ে যাবে যে এটি পছন্দসই বিন্যাসে ফিরে এসেছে:

numberFormatter.StringFromNumber(printVar)

এখানে ফলাফলটি এইভাবে "3.6" (বৃত্তাকার) হবে। যদিও এটি সর্বাধিক অর্থনৈতিক সমাধান নয়, আমি এটিকে দিচ্ছি কারণ ওপি প্রিন্টিংয়ের উল্লেখ করেছে (যার ক্ষেত্রে একটি স্ট্রিং অবাঞ্ছিত নয়) এবং কারণ এই শ্রেণিটি একাধিক পরামিতি সেট করার অনুমতি দেয়।


1
দ্রুত নোট করুন যে কোনও ফর্ম্যাটর প্রোগ্রামিং ব্যতীত ব্যয়বহুল, এটি দ্রুত এবং পুনরুক্তি সম্পাদন করা প্রয়োজন এমন কাজের জন্য অসুস্থ-পরামর্শ দেওয়া making
জোনাথন থর্নটন

7

আমি ব্যবহার করব

print(String(format: "%.3f", totalWorkTimeInHours))

এবং আপনার প্রয়োজনীয় দশমিক সংখ্যায় .3f পরিবর্তন করুন


তিনি 3 অঙ্ক সহ মুদ্রণ করতে চেয়েছিলেন, এটি এনএসটাইমে ইন্টারভালতে না পেয়ে
মোহসেন হোসেইন

7

উভয় ক্ষেত্রেই:

  1. ব্যবহার String(format:):

    • Typecast Doubleকরার Stringসঙ্গে %.3fবিন্যাস সুনির্দিষ্টভাবে উল্লেখ করা এবং তারপর ফিরেDouble

      Double(String(format: "%.3f", 10.123546789))!
    • বা Doubleএন-দশমিক স্থানগুলি পরিচালনা করতে প্রসারিত করুন :

      extension Double {
          func rounded(toDecimalPlaces n: Int) -> Double {
              return Double(String(format: "%.\(n)f", self))!
          }
      }
  2. গণনা দ্বারা

    • 10 ^ 3 দিয়ে গুণ করুন, এটি গোল করুন এবং তারপরে 10 ^ 3 দিয়ে ভাগ করুন ...

      (1000 * 10.123546789).rounded()/1000
    • বা Doubleএন-দশমিক স্থানগুলি পরিচালনা করতে প্রসারিত করুন :

      extension Double {    
          func rounded(toDecimalPlaces n: Int) -> Double {
              let multiplier = pow(10, Double(n))
              return (multiplier * self).rounded()/multiplier
          }
      }

6

এটি এন উল্লেখযোগ্য অঙ্কগুলিতে গোল করার আরও নমনীয় অ্যালগরিদম

সুইফট 3 সমাধান

extension Double {
// Rounds the double to 'places' significant digits
  func roundTo(places:Int) -> Double {
    guard self != 0.0 else {
        return 0
    }
    let divisor = pow(10.0, Double(places) - ceil(log10(fabs(self))))
    return (self * divisor).rounded() / divisor
  }
}


// Double(0.123456789).roundTo(places: 2) = 0.12
// Double(1.23456789).roundTo(places: 2) = 1.2
// Double(1234.56789).roundTo(places: 2) = 1200

6

দ্বিগুণ সম্পত্তি ফর্ম্যাট করার সর্বোত্তম উপায় হ'ল অ্যাপল পূর্বনির্ধারিত পদ্ধতিগুলি ব্যবহার করা।

mutating func round(_ rule: FloatingPointRoundingRule)

ফ্লোটিংপয়েন্টআরউন্ডিংআরুল একটি এনাম যা নিম্নলিখিত সম্ভাবনা রয়েছে

গণনার ক্ষেত্রে:

কেস দূরেFromZero যার নিকটতম উত্সের চেয়ে বৃহত্তর বা সমান তার নিকটতম অনুমোদিত মানের রাউন্ড।

উত্সের চেয়ে কম বা সমানতম নিকটতম অনুমোদিত মানের বৃত্তাকার কেস করুন

কেস নিকটতম অরওয়েফ্রমজিরো নিকটতম অনুমোদিত মানের রাউন্ড; যদি দুটি মান সমানভাবে নিকটে থাকে তবে বৃহত্তর মাত্রার একটি বেছে নেওয়া হয়।

কেস নিকটতমআরও নিকটতম অনুমোদিত মান থেকে রাউন্ড; যদি দুটি মান সমানভাবে নিকটে থাকে তবে একটিকেও বেছে নেওয়া হয়।

কেস নিকটতম অনুমোদিত মানের জিরো রাউন্ডের দিকে যার দৈর্ঘ্য উত্সের চেয়ে কম বা সমান।

আপ যদি গোলাকার যে এর চেয়ে বড় বা উৎস সমান নিকটতম অনুমতি মান।

var aNumber : Double = 5.2
aNumber.rounded(.up) // 6.0

6

দশমিক সংখ্যা x এর দ্বিগুণ মানকে গোল করুন
। দশমিকের পরে অঙ্কের

var x = 1.5657676754
var y = (x*10000).rounded()/10000
print(y)  // 1.5658 

var x = 1.5657676754 
var y = (x*100).rounded()/100
print(y)  // 1.57 

var x = 1.5657676754
var y = (x*10).rounded()/10
print(y)  // 1.6

এই কোড কি চলছে? তিনটি উদাহরণ কী দেখায়?
রেনে

কোডের উত্তরগুলি সহায়ক নয়, দয়া করে এই উদাহরণগুলির প্রত্যেকটি কী করে তা বোঝানোর চেষ্টা করুন।
মো

5

সুইফট নয় তবে আমি নিশ্চিত আপনি ধারণাটি পেয়ে গেছেন।

pow10np = pow(10,num_places);
val = round(val*pow10np) / pow10np;

4

এটি সুইফট 5-এ কাজ করছে বলে মনে হচ্ছে।

বেশ অবাক এর জন্য ইতিমধ্যে এর জন্য কোনও মানক কার্যকারিতা নেই।

// রাউন্ডিং সহ ডাবল থেকে এন-দশমিক স্থানে ছাঁটাই

extension Double {

    func truncate(to places: Int) -> Double {
    return Double(Int((pow(10, Double(places)) * self).rounded())) / pow(10, Double(places))
    }

}

2

আপনি এই এক্সটেনশনটি যুক্ত করতে পারেন:

extension Double {
    var clean: String {
        return self.truncatingRemainder(dividingBy: 1) == 0 ? String(format: "%.0f", self) : String(format: "%.2f", self)
    }
}

এবং এটিকে কল করুন:

let ex: Double = 10.123546789
print(ex.clean) // 10.12

এটি স্ট্রিং হিসাবে এটি উপস্থাপনের ঝরঝরে বাস্তবায়ন। আমি অবাক হয়েছি যে, পিরিয়ড পরেও ডাবল হিসাবে এটি বজায় রাখার পরে যদি সংখ্যা উপস্থাপনের সংখ্যা বাড়ানো সম্ভব বা যুক্তিযুক্ত হয়।
থিংসউইফ্ট

2

ফ্লোট অপূর্ণতা এড়াতে দশমিক ব্যবহার করুন

extension Float {
    func rounded(rule: NSDecimalNumber.RoundingMode, scale: Int) -> Float {
        var result: Decimal = 0
        var decimalSelf = NSNumber(value: self).decimalValue
        NSDecimalRound(&result, &decimalSelf, scale, rule)
        return (result as NSNumber).floatValue
    }
}

প্রাক্তন।
স্কেল: 2 এবং। ডাউন
সঙ্গে দশমিক ব্যবহার করার সময় 1075.58 রাউন্ডে 1075.57 এর দিকে যেতে হবে যখন স্কেল: 2 এবং .ডাউন 1075.58 রাউন্ড 1075.58 এ যান scale


1

আমি এটি ভাবছিলাম যে কোনও ব্যবহারকারীর ইনপুটটি সংশোধন করা সম্ভব কিনা। তারা যদি ডলারের পরিমাণের জন্য দুটি পরিবর্তে তিন দশমিক প্রবেশ করায়। 1.111 এর পরিবর্তে 1.111 বলুন আপনি কি এটি গোল করে ঠিক করতে পারবেন? অনেক কারণে উত্তর নেই! অর্থের সাথে অর্থাত্ 0.001 আসলে একটি বাস্তব চেকবুকে সমস্যা তৈরি করে।

পিরিয়ড পরে অনেক বেশি মানের জন্য ব্যবহারকারীদের ইনপুট চেক করার জন্য এখানে একটি ফাংশন দেওয়া আছে। তবে যা 1., 1.1 এবং 1.11 এর অনুমতি দেবে।

ধারণা করা হয় যে মানটি ইতিমধ্যে একটি স্ট্রিং থেকে একটি ডাবলে সফল রূপান্তরকরণের জন্য পরীক্ষা করা হয়েছে।

//func need to be where transactionAmount.text is in scope

func checkDoublesForOnlyTwoDecimalsOrLess()->Bool{


    var theTransactionCharacterMinusThree: Character = "A"
    var theTransactionCharacterMinusTwo: Character = "A"
    var theTransactionCharacterMinusOne: Character = "A"

    var result = false

    var periodCharacter:Character = "."


    var myCopyString = transactionAmount.text!

    if myCopyString.containsString(".") {

         if( myCopyString.characters.count >= 3){
                        theTransactionCharacterMinusThree = myCopyString[myCopyString.endIndex.advancedBy(-3)]
         }

        if( myCopyString.characters.count >= 2){
            theTransactionCharacterMinusTwo = myCopyString[myCopyString.endIndex.advancedBy(-2)]
        }

        if( myCopyString.characters.count > 1){
            theTransactionCharacterMinusOne = myCopyString[myCopyString.endIndex.advancedBy(-1)]
        }


          if  theTransactionCharacterMinusThree  == periodCharacter {

                            result = true
          }


        if theTransactionCharacterMinusTwo == periodCharacter {

            result = true
        }



        if theTransactionCharacterMinusOne == periodCharacter {

            result = true
        }

    }else {

        //if there is no period and it is a valid double it is good          
        result = true

    }

    return result


}

1
//find the distance between two points
let coordinateSource = CLLocation(latitude: 30.7717625, longitude:76.5741449 )
let coordinateDestination = CLLocation(latitude: 29.9810859, longitude: 76.5663599)
let distanceInMeters = coordinateSource.distance(from: coordinateDestination)
let valueInKms = distanceInMeters/1000
let preciseValueUptoThreeDigit = Double(round(1000*valueInKms)/1000)
self.lblTotalDistance.text = "Distance is : \(preciseValueUptoThreeDigit) kms"


1

আপনার যদি সংখ্যার মান সহ একটি পাঠ্য উপাদান প্রয়োজন হয় তা এখানে সুইফটুআইয়ের জন্য একটি।

struct RoundedDigitText : View {
    let digits : Int
    let number : Double

    var body : some View {
        Text(String(format: "%.\(digits)f", number))
    }
}
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.