لارافيل تعويم متغير تغيير القيمة عند إضافة إلى قاعدة البيانات

StackOverflow https://stackoverflow.com//questions/24024515

سؤال

النظرية

لدي قائمة إحداثيات شاملة (خطوط الطول والعرض إلى 7 منازل عشرية) ، والتي أريد أن أضيف إليها باستمرار.من أجل وقف الازدواجية البيانات ، لكل تنسيق الذي يحاول أن يتم إدخالها ، أريد أن تحقق قاعدة البيانات لمعرفة ما إذا كان خطوط الطول والعرض موجودة ، على نفس الصف.

تحقق لمعرفة ما إذا كانت الإحداثيات موجودة

 $coordinate = DB::table('coordinates')
            ->where('lat', '=', $geocode->getLatitude())
            ->where('lng', '=', $geocode->getLongitude())
            ->count();

الهجرة

Schema::create('coordinates', function(Blueprint $table)
        {
            $table->increments('id');
            $table->float('lat', 10, 7);
            $table->float('lng', 10, 7);
            $table->timestamps();
        });

عندما يتم تحويل عنوان المستخدم ، لقد لاحظت أنه عندما dd() متغير خط العرض ، يخرج على النحو التالي:

float(53.7960957) من الكود dd($geocode->getLatitude());

عندما أحاول إضافته بعد ذلك إلى قاعدة البيانات ، عن طريق إزالة dd(), ، العشري الفعلي الذي تمت إضافته إلى قاعدة البيانات هو 53.7960968 - موقع مختلف تماما عندما نتحدث عن الإحداثيات!

لماذا هو تغيير عشري من مرددا على الشاشة, إضافة إلى قاعدة البيانات?

هل أنا بحاجة لتحويله إلى تعويم قبل إضافة?كيف يمكنني حل هذا?

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

المحلول

تحديث:

أنا لم تستخدم الخلية في حين ، لذلك فعلت بعض البحوث أكثر.يبدو أن decimal النوع لديه القدرة على أن تكون دقيقة لمدة تصل إلى 65 رقما.نظرا لأنك تحتاج فقط إلى 7 أرقام مرت العشرية و 3 قبل العشرية ، فلن تواجه مشكلة في إنشاء مخطط باستخدام decimal(10,7).

سكل كمان


على افتراض أنك تستخدم الخلية ، ليس هناك الكثير الذي يمكنك القيام به.وفقا ل الوثائق, float و double الأنواع هي تمثيلات تقريبية:

تمثل الأنواع العائمة والمزدوجة قيم بيانات رقمية تقريبية.يستخدم الخلية أربعة بايت لقيم الدقة واحدة وثمانية بايت لقيم الدقة المزدوجة.

تحقق أيضا من هذا سكل كمان, ، سترى أن الخلية 5.5.32 سوف تمثل تعويم 53.7960957 كما 53.796100616455 و ضعف من 53.7960957 كما 53.7960957.قد ترغب في تحديث المخطط الخاص بك لاستخدام الزوجي بدلا من ذلك ، لمزيد من الدقة قليلا.

يمكنك أيضا تحديد دقة تعويم مع بناء الجملة غير قياسي (لذلك فمن غير المستحسن ، لقابلية لمعايير سكل الأخرى) باستخدام float(m,d) أين m هو مجموع الأرقام و d هو عدد الأرقام بعد العلامة العشرية.على سبيل المثال ، إذا كنت تريد السماح بقيم خطوط الطول/العرض (-180 إلى 180) مع ما يصل إلى 7 أرقام من الدقة بعد العلامة العشرية..يجب أن تكون قادرا على إنشاء الجدول الخاص بك مع float(10,7).لكن, كما سترى, ، هذا لم يكن دقيقا كما كان مزدوج.

نصائح أخرى

كما يقول الكاتب ...استخدام إنستاد مزدوج من تعويم ...

هل يمكن أيضا استخدام 1 6 تدوين لذلك سيكون عدد صحيح لحفظ هو الخلية.

53.7960957 * 1E6 = 537960957
537960957 / 1E6 = 53.7960957

هذه هي الطريقة التي أستخدمها لحفظ الإحداثيات الجغرافية

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