سؤال

أحاول أن أتعلم استخدام إعلانات مساحات الأسماء أكثر تحديداً من عدم القول فقط "استخدام مساحة الاسم STD". أحاول تنسيق بياناتي إلى مكانين عشريين ، وضبط التنسيق ليكون ثابتًا وليس علميًا. هذا هو ملفي الرئيسي:

#include <iostream>
#include <iomanip>

#include "SavingsAccount.h"
using std::cout;
using std::setprecision;
using std::ios_base;

int main()
{
    SavingsAccount *saver1 = new SavingsAccount(2000.00);
    SavingsAccount *saver2 = new SavingsAccount(3000.00);

    SavingsAccount::modifyInterestRate(.03);

    saver1->calculateMonthlyInterest();
    saver2->calculateMonthlyInterest();

    cout << ios_base::fixed << "saver1\n" << "monthlyInterestRate: " << saver1->getMonthlyInterest()
        << '\n' << "savingsBalance: " << saver1->getSavingsBalance() << '\n';
    cout << "saver2\n" << "monthlyInterestRate: " << saver2->getMonthlyInterest()
        << '\n' << "savingsBalance: " << saver2->getSavingsBalance() << '\n';
}

في Visual Studio 2008 ، عندما أقوم بتشغيل برنامجي ، أحصل على إخراج "8192" قبل البيانات التي أريدها. هل هناك سبب لذلك؟

أيضًا ، لا أعتقد أنني أقوم بتعيين الجزء الثابت أو الأماكن العشرية بشكل صحيح حيث يبدو أنني أحصل على تدوين علمي بمجرد إضافة SetPrecision (2). شكرًا.

هل كانت مفيدة؟

المحلول

انت تريد std::fixed (الآخر يدرج قيمته في الدفق ، ولهذا السبب ترى 8192) ، ولا أرى مكالمة إلى std::setprecision في الكود الخاص بك في أي مكان.
هذا سيصلحه:

#include <iostream>
#include <iomanip>

using std::cout;
using std::setprecision;
using std::fixed;

int main()
{
    cout << fixed << setprecision(2)
         << "saver1\n" 
         << "monthlyInterestRate: " << 5.5 << '\n' 
         << "savingsBalance: " << 10928.8383 << '\n';
    cout << "saver2\n" 
         << "monthlyInterestRate: " << 4.7 << '\n' 
         << "savingsBalance: " << 22.44232 << '\n';
}

نصائح أخرى

قد لا يكون هذا هو الإجابة التي تبحث عنها ، لكن أرقام النقطة العائمة ليست مناسبة للحسابات المالية لأن الكسور مثل 1/100 لا يمكن تمثيلها بالضبط. قد تكون أفضل حالًا في القيام بتنسيق نفسك. يمكن تغليف هذا:

class money {
    int cents;
public:
    money( int in_cents ) : cents( in_cents ) {}

    friend ostream &operator<< ( ostream &os, money const &rhs )
        { return os << '$' << m.cents / 100 << '.' << m.cents % 100; }
};

cout << money( 123 ) << endl; // prints $1.23

أفضل (؟) حتى الآن ، C ++ لديه منشأة تسمى الفئة المحلية النقدية الذي يشمل أ تنسيق المال الذي يأخذ سنتات كحجة.

locale::global( locale("") );
use_facet< money_put<char> >( locale() ).put( cout, false, cout, ' ', 123 );

يجب أن يفعل هذا الشيء الصحيح على المستوى الدولي ، وطباعة العملة المحلية للمستخدم وإخفاء عدد الأماكن العشرية من التنفيذ. حتى أنه يقبل كسور المائة. لسوء الحظ ، لا يبدو أن هذا يعمل على نظامي (Mac OS X) ، والذي يحظى بضعف دعم موضعي بشكل عام. (يجب أن يكون Linux و Windows أفضل.)

cout << setiosflags(ios::fixed) << setprecision(2) << 1/3.;

ios_base::fixed ليس معالجًا ، فهي قيمة (1 << 13) لعلم iOS.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top