Pertanyaan perkalian dan pembagian dengan desimal


Saya baru ke C # dan sekarang memiliki masalah dengan hal-hal matematika. Mengapa saya tidak dapat mulitplicate atau membagi "sederhana" seperti ini:

 decimal mLon1 = 0;
 decimal mLat1 = 0;
 decimal mFactor = 111021;
 decimal mRadius = 100;
 decimal mLat = 12.123;

 mLon1 = mLon - mRadius / Math.Abs(Math.Cos(((Math.PI / 180) * mLat)) * mFaktor);
 mLat1 = mLat - (mRadius / mFaktor);

Compiler Menampilkan kesalahan:

Operator '*' tidak dapat diterapkan pada operan tipe 'ganda' dan 'desimal'.

Sama dengan Operator '/' ...

Bagaimana saya bisa mendapatkan kode saya bekerja? Thx untuk petunjuk apa pun.


5
2018-03-27 07:10


asal


Jawaban:


coba kode di bawah dan Anda memiliki kesalahan ejaan dekat "mFaktor" yang seharusnya "mFactor"

decimal mLon1 = 0;
decimal mLat1 = 0;
decimal mFactor = 111021;
decimal mRadius = 100;
decimal mLat = (decimal)12.123;
decimal mLon = 0;
mLon1 = mLon - mRadius / (decimal)Math.Abs(Math.Cos(((Math.PI / 180) * (double)mLat)) * (double)mFactor);
mLat1 = mLat - (mRadius / mFactor);

0
2018-03-27 07:13



C # adalah a jenis-aman bahasa, yang saya maksudkan dengan jenis aman adalah bahwa kode memungkinkan pengembang untuk memastikan bahwa nilai atau objek akan menjadi tipe tertentu sehingga ia dapat menggunakannya dengan cara tertentu tanpa takut perilaku yang tidak terduga atau tidak terdefinisi. C # hanya beberapa konversi implisit dari tipe seperti int ke double

Ubah kode Anda seperti yang ditunjukkan di bawah ini

decimal mLon1 = 0M;
decimal mLat1 = 0M;
decimal mFactor = 111021M;//mFactor is never used
decimal mRadius = 100M;
decimal mLat = 12.123M;

mLon1 = mLon - mRadius / Math.Abs(Convert.ToDecimal(Math.Cos((Math.PI / 180) * Convert.ToDouble(mLat))) * mFaktor);//mFaktor and mLon is not defined
mLat1 = mLat - (mRadius / mFaktor);

Sini Convert.ToDouble(mLat) mengkonversi mLat untuk double karena C # tidak mengizinkan konversi implisit decimal untuk double, mengapa aku melakukan ini? Baik Math.Cos ternyata hanya menerima doublebegitu juga halnya Math.Abs

Solusi lainnya adalah Anda dapat mengonversi setiap variabel yang dideklarasikan sebagai double dan mengurangi rasa sakit dari konversi jenis eksplisit di antaranya

double mLon1 = 0D;
double mLat1 = 0D;
double mFactor = 111021D;//mFactor is never used
double mRadius = 100D;
double mLat = 12.123D;

mLon1 = mLon - mRadius / Math.Abs(Math.Cos(((Math.PI / 180D) * mLat)) * mFaktor);//mFaktor and mLon is not defined
mLat1 = mLat - (mRadius / mFaktor);

Silakan lihat referensi yang disebutkan di bawah dan jenis apa yang ingin Anda gunakan dalam skenario ini yang Anda hadapi.

Floating point reference

Referensi: MSDN


4
2018-03-27 07:48



Anda tidak harus menggunakan tipe desimal untuk penggunaan ini. Gunakan tipe ganda dan semuanya akan baik-baik saja.

Dalam kasus Anda, fungsi matematika mengembalikan nomor floating presisi ganda (64 bit) dan tipe desimal adalah tipe data non-pribumi tipe floating 128 bit.

Anda tidak dapat secara langsung mengalikan dua angka yang tidak memiliki ukuran memori yang sama.


2
2018-03-27 07:15



Pertama-tama, kode Anda bahkan tidak dikompilasi.

Jika ingin digunakan 12.123 sebagai decimal, Anda perlu menggunakan m atau M akhiran. Jika Anda tidak menggunakan sufiks apa pun dengan tipe mengambang Anda, C # menganggapnya sebagai a double.

Dari decimal (C # Referensi)

Jika Anda ingin literal nyata numerik untuk diperlakukan sebagai desimal, gunakan   akhiran m atau M. Tanpa suffix m, nomor diperlakukan sebagai ganda   dan menghasilkan kesalahan kompilator.

Dan tidak ada konversi implisit antara jenis floating-point (float dan double) dan decimal mengetik.

Sejak Math.PI bidang mewakili double, Anda Math.PI / 180 akan double. Sejak mLat aku s decimal (Anda mengatakan itu adalah kesalahan mengeja) yang Anda coba dapatkan double * decimal yang jelas Anda mendapatkan kesalahan ini. Anda mencoba untuk operasi yang sama dengan / operator juga.

Dari C # Spec $ 7.7.1 Operator perkalian

float operator *(float x, float y);
double operator *(double x, double y);
decimal operator *(decimal x, decimal y);

Dan dari C # Spec $ 7.7.2 Operator divisi

float operator /(float x, float y);
double operator /(double x, double y);
decimal operator /(decimal x, decimal y);

Seperti yang Anda lihat dari dokumentasi ini, tidak ada definisi double * decimal atau double / decimal operasi.


1
2018-03-27 07:37



Anda juga bisa menggunakan variabel tipe double dari pada decimal.


0
2018-03-27 07:14