জাভাস্ক্রিপ্টে ভাসমান পয়েন্ট সংখ্যা যথার্থতার সাথে কীভাবে মোকাবিলা করবেন?


617

আমার কাছে নিম্নলিখিত ডামি পরীক্ষার স্ক্রিপ্ট রয়েছে:

function test() {
  var x = 0.1 * 0.2;
  document.write(x);
}
test();

এই ফলাফল প্রিন্ট হবে 0.020000000000000004যখন এটি শুধু প্রিন্ট করা উচিত 0.02(যদি আপনার ক্যালকুলেটর ব্যবহার)। আমি যতদূর বুঝতে পেরেছি এটি ভাসমান পয়েন্টের গুণনের যথার্থে ত্রুটির কারণে।

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

অবশ্যই, অন্যথায় আমি 10 টি বা তার বেশি অঙ্ক করব।


118
আসলে, ত্রুটিটি কারণ 0.1একটি সীমাবদ্ধ বাইনারি ভাসমান পয়েন্ট সংখ্যাটিতে মানচিত্রের কোনও উপায় নেই ।
অ্যারন দিগুল্লা

10
সর্বাধিক ভগ্নাংশ দশমিকের সাথে সঠিক নির্ভুলতার সাথে রূপান্তর করা যায় না। একটি ভাল ব্যাখ্যা এখানে: docs.python.org/reLive/2.5.1/tut/node16.html
Nate


53
@ সালমানা: আপনার জাভাস্ক্রিপ্ট রানটাইমটি আপনার কাছ থেকে এই সমস্যাটি লুকিয়ে রাখার অর্থ এই নয় যে আমি ভুল wrong
অ্যারন দিগুল্লা

5
হারুনের সাথে একমত নন, বাইনারিতে পুরোপুরি এবং সম্পূর্ণরূপে 0.1 কোড করার উপায় রয়েছে। তবে আইইইই 754 অগত্যা এটি সংজ্ঞায়িত করে না। এমন একটি উপস্থাপনা কল্পনা করুন যেখানে আপনি একদিকে যেমন বাইনারিতে পূর্ণসংখ্যার অংশটি, অন্যদিকে দশমিক অংশ, এন ডেসিমাল পর্যন্ত বাইনারি তেমন একটি সাধারণ পূর্ণসংখ্যার> 0 এর মতো এবং শেষ পর্যন্ত দশমিক বিন্দুর অবস্থান নির্ধারণ করেন । ঠিক আছে, আপনি কোনও ত্রুটি ছাড়াই পুরোপুরি 0.1 টি উপস্থাপন করবেন। বিটিডব্লিউ, যেহেতু জেএস অভ্যন্তরীণভাবে একটি সীমাবদ্ধ সংখ্যার ব্যবহার করে, তাই তারা শেষ দশমিকগুলিতে সেই ভুলটি না করার জন্য সাহসগুলি কোড করে দিতে পারে।
ফাবিয়েন হাদ্দাদি

উত্তর:


469

থেকে ফ্লোটিং-পয়েন্ট গাইড :

এই সমস্যা এড়াতে আমি কী করতে পারি?

এটি নির্ভর করে আপনি কী ধরণের গণনা করছেন।

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

মনে রাখবেন যে প্রথম পয়েন্টটি কেবলমাত্র আপনার ক্ষেত্রে সুনির্দিষ্ট সুনির্দিষ্ট দশমিক আচরণের প্রয়োজন হলে প্রযোজ্য । বেশিরভাগ লোকের এটির প্রয়োজন হয় না, তারা কেবল বিরক্ত হয় যে তাদের প্রোগ্রামগুলি 1/10 এর মতো সংখ্যার সাথে সঠিকভাবে কাজ করে না তা বুঝতে পেরে যে এটি 1/3 এর সাথে ঘটে তবে তারা একই ত্রুটিতে ঝাঁকুনিও দেবে না।

প্রথম পয়েন্টটি যদি সত্যিই আপনার ক্ষেত্রে প্রযোজ্য হয় তবে জাভাস্ক্রিপ্টের জন্য বিগডিসিমাল ব্যবহার করুন , যা মোটেও মার্জিত নয়, তবে প্রকৃতপক্ষে অসম্পূর্ণ কাজটি করার চেয়ে সমস্যাটি সমাধান করে।


11
আমি বিগডিসিমালের জন্য আপনার মৃত লিঙ্কটি লক্ষ্য করেছি এবং একটি আয়না সন্ধান করার সময় আমি বিগনম্বার নামে একটি বিকল্প পেয়েছি: jsfromhell.com/classes/bignumber
জ্যাকসনকর

4
@ বাস-টি: হ্যাঁ, তবে ফ্লোটগুলি হুবহু দৈর্ঘ্যের অবধি পূর্ণসংখ্যার প্রতিনিধিত্ব করতে পারে এবং ইসিএমএ স্ট্যান্ডার্ড অনুসারে এটি একটি bit৪ বিটের ফ্লোট। সুতরাং এটি ঠিক 2 ^ 52 অবধি পূর্ণসংখ্যার প্রতিনিধিত্ব করতে পারে
মাইকেল বর্গওয়ার্ট

5
@ কার্ল: দশমিক ভগ্নাংশ 1/10 টি বেস 2 এ সীমাবদ্ধ বাইনারি ভগ্নাংশ হিসাবে প্রতিনিধিত্ব করা যায় না, এবং এটি জাভাস্ক্রিপ্ট সংখ্যাগুলি। সুতরাং এটি হল ঠিক একই সমস্যা আসলে।
মাইকেল বর্গওয়ার্ট

12
আমি আজ শিখেছি যে এমনকি পূর্ণসংখ্যার জাভাস্ক্রিপ্টে যথাযথ সমস্যা রয়েছে। বিবেচনা করুন যে console.log(9332654729891549)আসলে কপি করে প্রিন্ট 9332654729891548(এক দ্বারা বন্ধ অর্থাৎ!)
mlathe

12
@ ম্যালথে: দোহ .. ;P... এর মধ্যে 2⁵²= 4,503,599,627,370,496এবং 2⁵³= 9,007,199,254,740,992উপস্থাপনযোগ্য সংখ্যা হুবহু পূর্ণসংখ্যা । পরবর্তী পরিসর জন্য, থেকে 2⁵³থেকে 2⁵⁴, সবকিছু হয় দ্বারা গুন2 , তাই representable সংখ্যা এমনকি যাদের , ইত্যাদি বিপরীতভাবে, থেকে আগের পরিসীমা জন্য 2⁵¹করতে 2⁵², ব্যবধান হয় 0.5, ইত্যাদি এই কারণে কেবল বৃদ্ধি | বেস হ্রাস | সোর্স 2 | বাইনারি সূচক 64-বিট ভাসা মান (যা আবার এর খুব কমই নথিভুক্ত 'অপ্রত্যাশিত আচরণ ব্যাখ্যা করে এর / toPrecision()মধ্যবর্তী মানের জন্য 0এবং 1)।
গীতারল্যাব

125

আমি পেড্রো লাদারিয়ার সমাধানটি পছন্দ করি এবং অনুরূপ কিছু ব্যবহার করি।

function strip(number) {
    return (parseFloat(number).toPrecision(12));
}

পেড্রোস সমাধানের বিপরীতে এটি 0.999 টি বাড়বে ... পুনরাবৃত্তি করছে এবং কমপক্ষে উল্লেখযোগ্য অঙ্কে এটি প্লাস / বিয়োগের সাথে নির্ভুল।

দ্রষ্টব্য: 32 বা 64 বিট ফ্লোট নিয়ে কাজ করার সময়, সেরা ফলাফলের জন্য আপনার প্রিভিশন (7) এবং টু প্রিভিশন (15) ব্যবহার করা উচিত। কেন এই তথ্যের জন্য এই প্রশ্নটি দেখুন ।


21
আপনি 12 বাছাই করার কোনও কারণ?
কিওয়ারটিম্ক

17
toPrecisionএকটি সংখ্যার পরিবর্তে একটি স্ট্রিং প্রদান করে। এটি সর্বদা কাম্য হতে পারে না।
এসএসটানলে

7
parseFloat (1.005) .toPrecision (3) => 1.00
পিটার

5
@ ব্যবহারকারী ২৪২৮১৮৮, আমি জানি, আমি রাউন্ডিং ত্রুটিটি বোঝাতে চেয়েছিলাম, ফলাফলটি 1.01 এর পরিবর্তে 1.00
পিটার

9
@ ব্যবহারকারী 2428118 যা বলেছে তা যথেষ্ট পরিমাণে সুস্পষ্ট নাও হতে পারে: (9.99*5).toPrecision(2)= 49 এর পরিবর্তে 49.95 এর পরিবর্তে টপপ্রিসন কেবলমাত্র দশমিক নয়, পুরো সংখ্যাটি গণনা করে। তারপরে আপনি ব্যবহার করতে পারেন তবে toPrecision(4)আপনার ফলাফলটি যদি 100 হয় তবে আপনি আবার ভাগ্যের বাইরে চলে যাবেন কারণ এটি প্রথম তিনটি সংখ্যা এবং এক দশমিককে অনুমতি দেবে, এইভাবে বিন্দুটি স্থানান্তরিত করবে এবং এটিকে আরও বা কম ব্যবহারের উপযোগী করবে না। toFixed(2)পরিবর্তে আমি শেষ করেছি
এক্সেল

79

গাণিতিকভাবে ঝুঁকির জন্য: http://docs.oracle.com/cd/E19957-01/806-3568/ncg_goldberg.html

প্রস্তাবিত পদ্ধতির সংশোধন কারণগুলি ব্যবহার করা হয় (10 এর উপযুক্ত শক্তির দ্বারা গুণিত করুন যাতে পূর্ণসংখ্যার মধ্যে পাটিগণিত হয়)। উদাহরণস্বরূপ, ক্ষেত্রে 0.1 * 0.2, সংশোধন ফ্যাক্টর 10এবং আপনি গণনা সম্পাদন করছেন:

> var x = 0.1
> var y = 0.2
> var cf = 10
> x * y
0.020000000000000004
> (x * cf) * (y * cf) / (cf * cf)
0.02

একটি (খুব তাড়াতাড়ি) সমাধান দেখতে এমন কিছু দেখায়:

var _cf = (function() {
  function _shift(x) {
    var parts = x.toString().split('.');
    return (parts.length < 2) ? 1 : Math.pow(10, parts[1].length);
  }
  return function() { 
    return Array.prototype.reduce.call(arguments, function (prev, next) { return prev === undefined || next === undefined ? undefined : Math.max(prev, _shift (next)); }, -Infinity);
  };
})();

Math.a = function () {
  var f = _cf.apply(null, arguments); if(f === undefined) return undefined;
  function cb(x, y, i, o) { return x + f * y; }
  return Array.prototype.reduce.call(arguments, cb, 0) / f;
};

Math.s = function (l,r) { var f = _cf(l,r); return (l * f - r * f) / f; };

Math.m = function () {
  var f = _cf.apply(null, arguments);
  function cb(x, y, i, o) { return (x*f) * (y*f) / (f * f); }
  return Array.prototype.reduce.call(arguments, cb, 1);
};

Math.d = function (l,r) { var f = _cf(l,r); return (l * f) / (r * f); };

এক্ষেত্রে:

> Math.m(0.1, 0.2)
0.02

আমি অবশ্যই সিনফুলজেএস এর মতো পরীক্ষিত গ্রন্থাগারটি ব্যবহার করার পরামর্শ দিচ্ছি


1
Il এই মার্জিত workaround ভালবাসা কিন্তু নিখুঁত বলে মনে হচ্ছে না: jsfiddle.net/Dm6F5/1 ম্যাথ.এ (76.65, 38.45) 115.10000000000002
নিকোলোলিয়াস

3
ম্যাথ.এম (10,2332226616) আমাকে "-19627406800" দিচ্ছে যা একটি নেতিবাচক মান ... আমি আশা করি একটি উচ্চতর সীমা থাকতে হবে - সম্ভবত এটিই এই সমস্যার কারণ হয়ে উঠছে। দয়া করে পরামর্শ দিন
শিব কমুরাভেলি

1
এটি সমস্ত দুর্দান্ত দেখায় তবে মনে হয় কোথাও কোথাও একটি বা দুটি ভুল হয়েছে।
মিঃইলো

5
খুব দ্রুত সমাধান তিনি বলেছিলেন ... ভাঙা ফিক্স কেউ কখনও বলেনি।
কোজবি

2
উপরের কোডটি ব্যবহার করবেন না। এটি কার্যকর না হলে এটি একেবারে 'দ্রুত সমাধান' নয়। এটি একটি গণিত সম্পর্কিত প্রশ্ন, সুতরাং নির্ভুলতা প্রয়োজন।
ড্রেনাই

49

আপনি কি কেবল গুণ করছেন? যদি তা হয় তবে আপনি নিজের সুবিধার জন্য দশমিক গাণিতিক সম্পর্কে একটি ঝরঝরে গোপন ব্যবহার করতে পারেন। এটাই NumberOfDecimals(X) + NumberOfDecimals(Y) = ExpectedNumberOfDecimals। এর অর্থ এই যে আমাদের যদি থাকে 0.123 * 0.12তবে আমরা জানি যে 5 টি দশমিক স্থান থাকবে কারণ 0.1233 টি দশমিক স্থান রয়েছে এবং 0.12এর দুটি রয়েছে। সুতরাং যদি জাভাস্ক্রিপ্ট আমাদের কাছে এমন একটি নম্বর 0.014760000002দেয় তবে যথাযথতা হারাবার আশঙ্কা ছাড়াই আমরা নিরাপদে 5 ম দশমিক স্থানে যেতে পারি।


6
... এবং দশমিক জায়গাগুলির সঠিক পরিমাণ কীভাবে পাবেন ।
লাইন-ও

7
0.5 * 0.2 = 0.10; আপনি এখনও 2 দশমিক স্থানে (বা কম) ছাঁটাই করতে পারেন। তবে এই আইনের বাইরে কোনও গাণিতিক তাত্পর্য সহ কোনও সংখ্যা কখনই থাকবে না।
নাট জাউগ

3
আপনি কি এই জন্য একটি প্রশংসাপত্র আছে? আরও মনে রাখবেন যে বিভাজনের ক্ষেত্রে এটি একই নয়।
গ্রিফিন

3
@ নাটজাউগ আপনি উপচে পড়া দশমিককে ছাঁটাই করতে পারবেন না, আপনাকে পরিমাণটি গোল করতে হবে, কারণ 2090.5 * 8.61 17999.205 তবে ফ্লোটে এটি 17999.204999999998
লস্টফিল্ডস

3
@ লস্টফিল্ডস - আপনি সঠিক! আমি আমার উত্তর আপডেট করেছি।
নাট জাওগ

29

আপনি sprintfজাভাস্ক্রিপ্টের জন্য একটি বাস্তবায়নের সন্ধান করছেন, যাতে আপনি যে ফর্ম্যাটটি আশা করেন সেগুলিতে (যেমন তারা বাইনারি ফর্ম্যাটে সংরক্ষণ করা হয়) ছোট ছোট ত্রুটি সহ ফ্লোটগুলি লিখতে পারেন।

জাভাস্ক্রিপ্ট-স্প্রিন্টফ চেষ্টা করে দেখুন , আপনি এটিকে এভাবে ডাকবেন:

var yourString = sprintf("%.2f", yourNumber);

আপনার সংখ্যাটি দশমিক স্থান সহ একটি ফ্লোট হিসাবে মুদ্রণ করতে।

আপনি প্রদর্শন করার জন্য নাম্বার টু ফিক্সড () ব্যবহার করতে পারেন , যদি আপনি কেবল কোনও নির্দিষ্ট নির্ভুলতার জন্য কেবলমাত্র ভাসমান পয়েন্টের জন্য আরও ফাইলগুলি অন্তর্ভুক্ত না করেন।


4
আমি মনে করি এটিই সবচেয়ে পরিষ্কার সমাধান। আপনার যদি সত্যিই ফলাফলটি 0.02 হওয়ার দরকার না হয় তবে ছোট ত্রুটিটি নগন্য। মনে হচ্ছে যা গুরুত্বপূর্ণ তা হল আপনার নম্বরটি দুর্দান্তভাবে প্রদর্শিত হবে , এটি নয় যে আপনার স্বেচ্ছাচারিত নির্ভুলতা রয়েছে।
লং ওইয়াং

2
প্রদর্শনের জন্য এটি প্রকৃত পক্ষে সর্বোত্তম বিকল্প, জটিল গণনার জন্য, বার্গওয়ার্টের উত্তরটি পরীক্ষা করুন।
পাওয়া যায় না

4
তবে তারপরে আবার এটি আপনার নাম্বার.টোফিক্সড (2) এর মতো একই স্ট্রিংটি আসবে।
রবার্ট

27

আমি BigNumber.js সন্ধান করছি আমার প্রয়োজনীয়তা পূরণ করে।

স্বেচ্ছাসেবী-যথার্থ দশমিক এবং অ-দশমিক গণিতের জন্য একটি জাভাস্ক্রিপ্ট লাইব্রেরি।

এটিতে ভাল ডকুমেন্টেশন রয়েছে এবং লেখক প্রতিক্রিয়া জানাতে খুব পরিশ্রমী।

একই লেখকের 2 টি অনুরূপ অন্যান্য গ্রন্থাগার রয়েছে:

Big.js

স্বেচ্ছাসেবী-নির্ভুলতা দশমিক গণিতের জন্য একটি ছোট, দ্রুত জাভাস্ক্রিপ্ট লাইব্রেরি। Bignumber.js ছোট বোন।

এবং দশমিক.জেএস

জাভাস্ক্রিপ্টের জন্য একটি নির্বিচারে-নির্ভুলতা দশমিক প্রকার।

বিগনম্বার ব্যবহার করে এখানে কিছু কোড দেওয়া হয়েছে:

$(function(){

  
  var product = BigNumber(.1).times(.2);  
  $('#product').text(product);

  var sum = BigNumber(.1).plus(.2);  
  $('#sum').text(sum);


});
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.11.1/jquery.min.js"></script>

<!-- 1.4.1 is not the current version, but works for this example. -->
<script src="http://cdn.bootcss.com/bignumber.js/1.4.1/bignumber.min.js"></script>

.1 &times; .2 = <span id="product"></span><br>
.1 &plus; .2 = <span id="sum"></span><br>


3
একটি লাইব্রেরি ব্যবহার করা অবশ্যই আমার মতে সেরা পছন্দ।
অ্যান্থনি

1
এই লিঙ্কটি থেকে github.com/MikeMcl/big.js/issues/45 bignumber.js -> আর্থিক দশমিক.js -> বৈজ্ঞানিক বিগ.জেএস -> ???
ভি

20
var times = function (a, b) {
    return Math.round((a * b) * 100)/100;
};

--- বা ---

var fpFix = function (n) {
    return Math.round(n * 100)/100;
};

fpFix(0.1*0.2); // -> 0.02

--- এছাড়াও ---

var fpArithmetic = function (op, x, y) {
    var n = {
            '*': x * y,
            '-': x - y,
            '+': x + y,
            '/': x / y
        }[op];        

    return Math.round(n * 100)/100;
};

--- যেমন ---

fpArithmetic('*', 0.1, 0.2);
// 0.02

fpArithmetic('+', 0.1, 0.2);
// 0.3

fpArithmetic('-', 0.1, 0.2);
// -0.1

fpArithmetic('/', 0.2, 0.1);
// 2

4
আমি মনে করি যে ফলাফল হিসাবে একই সমস্যা দিতে হবে। আপনি একটি ভাসমান পয়েন্টটি ফিরিয়ে দেন যাতে বড় সুযোগের ফেরতের মানটিও "ভুল" হয়ে যায়।
জার্মটজান

1
খুব চালাক এবং দরকারী, +1।
জোনাটাস ওয়াকার

18

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

function multFloats(a,b){
  var atens = Math.pow(10,String(a).length - String(a).indexOf('.') - 1), 
      btens = Math.pow(10,String(b).length - String(b).indexOf('.') - 1); 
  return (a * atens) * (b * btens) / (atens * btens); 
}

ইডব্ল্যু। হ্যাঁ, আসুন ভাসমান পয়েন্ট গণিতের জন্য সংখ্যাগুলিকে স্ট্রিংয়ে রূপান্তর করুন এবং এর উত্তর হিসাবে প্রস্তাবও দিন।
অ্যান্ড্রু

16

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

function precisionRound(number, precision) {
  var factor = Math.pow(10, precision);
  return Math.round(number * factor) / factor;
}

কনসোল.লগ (নির্ভুলতা রাউন্ড (1234.5678, 1)); // প্রত্যাশিত আউটপুট: 1234.6

কনসোল.লগ (নির্ভুলতা রাউন্ড (1234.5678, -1)); // প্রত্যাশিত আউটপুট: 1230

var inp = document.querySelectorAll('input');
var btn = document.querySelector('button');

btn.onclick = function(){
  inp[2].value = precisionRound( parseFloat(inp[0].value) * parseFloat(inp[1].value) , 5 );
};

//MDN function
function precisionRound(number, precision) {
  var factor = Math.pow(10, precision);
  return Math.round(number * factor) / factor;
}
button{
display: block;
}
<input type='text' value='0.1'>
<input type='text' value='0.2'>
<button>Get Product</button>
<input type='text'>

আপডেট: আগস্ট / 20/2019 সবেমাত্র এই ত্রুটিটি লক্ষ্য করেছেন। আমি বিশ্বাস করি এটি ম্যাথ.াউন্ড () এর সাথে একটি ভাসমান পয়েন্ট যথার্থ ত্রুটির কারণে।

precisionRound(1.005, 2) // produces 1, incorrect, should be 1.01

এই অবস্থাগুলি সঠিকভাবে কাজ করে:

precisionRound(0.005, 2) // produces 0.01
precisionRound(1.0005, 3) // produces 1.001
precisionRound(1234.5, 0) // produces 1235
precisionRound(1234.5, -1) // produces 1230

ফিক্স:

function precisionRoundMod(number, precision) {
  var factor = Math.pow(10, precision);
  var n = precision < 0 ? number : 0.01 / factor + number;
  return Math.round( n * factor) / factor;
}

দশমিকের বৃত্তাকার সময় ডানদিকে এটি কেবল একটি অঙ্ক যোগ করে। এমডিএন ম্যাথ.উন্ড পৃষ্ঠাকে আপডেট করেছে যাতে সম্ভবত কেউ আরও ভাল সমাধান সরবরাহ করতে পারে।


ভুল উত্তর. 10.2 সর্বদা 10.19 এ ফিরে আসবে। jsbin.com/tozogiwide/edit?html,js,
কনসোল,

@ ইলভিনাস আপনার পোস্ট করা জেএসবিন লিঙ্কটি উপরে তালিকাভুক্ত MDN ফাংশনটি ব্যবহার করে না। আমি মনে করি আপনার মন্তব্যটি ভুল ব্যক্তির দিকে পরিচালিত হয়েছে।
হ্যালো ওয়ার্ল্ডপিস

13

আপনি আসলে কত দশমিক সংখ্যা চান তা সম্পর্কে আপনাকে নিজের মন তৈরি করতে হবে - কেক থাকতে পারে না এবং এটিও খেতে পারে না :-)

প্রতিটি পরবর্তী ক্রিয়াকলাপের সাথে সংখ্যাসূচক ত্রুটিগুলি জমে এবং আপনি যদি তা তাড়াতাড়ি না কেটে ফেলেন তবে এটি কেবল বাড়তে চলেছে। সংখ্যাসূচক গ্রন্থাগারসমূহ যা পরিচ্ছন্ন দেখায় ফলাফলগুলি প্রতি পদক্ষেপে কেবল শেষ 2 টি সংখ্যা কেটে দেয়, সংখ্যার সহ-প্রসেসরগুলির একই কারণে একটি "সাধারণ" এবং "পূর্ণ" দৈর্ঘ্য থাকে। সিউফ-অফগুলি প্রসেসরের জন্য সস্তা তবে কোনও স্ক্রিপ্টে আপনার জন্য খুব ব্যয়বহুল (গুণমান এবং বিভাজক এবং pov (...) ব্যবহার করে)। গুড ম্যাথ লাইব আপনার জন্য কাট অফ করতে মেঝে (x, n) সরবরাহ করবে।

সুতরাং খুব কমপক্ষে আপনার পোভ (10, এন) দিয়ে গ্লোবাল ভার / ধ্রুবক তৈরি করা উচিত - এর অর্থ হল যে আপনার প্রয়োজনীয় নির্ভুলতার বিষয়ে সিদ্ধান্ত নিয়েছেন :-) তারপরে করুন:

Math.floor(x*PREC_LIM)/PREC_LIM  // floor - you are cutting off, not rounding

আপনি গণিত করতে এবং শেষে কেবল কাট অফ রাখতে পারেন - ধরে নেওয়া যে আপনি কেবল ফলাফল প্রদর্শন করছেন এবং ফলাফলগুলি সহ-ই-টি করছেন না। আপনি যদি এটি করতে পারেন তবে .toFixed (...) আরও কার্যকর হতে পারে।

যদি আপনি ই-এস / তুলনা করছেন এবং তা কাটাতে না চান তবে আপনার একটি ছোট ধ্রুবক প্রয়োজন, সাধারণত এপিএস বলা হয়, এটি সর্বাধিক প্রত্যাশিত ত্রুটির চেয়ে দশমিক এক স্থান বেশি। বলুন যে আপনার কাটা অফটি শেষ দুটি দশমিক - তবে আপনার ইপসটি সর্বশেষ (তৃতীয়তম তাত্পর্যপূর্ণ) থেকে তৃতীয় স্থানে 1 রয়েছে এবং ফলাফলটি প্রত্যাশিত ইপিএস পরিসরের মধ্যে রয়েছে কিনা তা তুলনা করতে আপনি এটি ব্যবহার করতে পারেন (0.02 -ps <0.1 * 0.2 <0.02 + ইপিএস)।


দরিদ্র ব্যক্তির বৃত্তাকারী করার জন্য আপনি 0.5 টি যোগ করতে পারেন: ম্যাথ.ফ্লুর (x * PREC_LIM + 0.5) / PREC_LIM
সেমিগ্রোনির্গো

নোট যদিও, যে যেমন Math.floor(-2.1)হয় -3। সুতরাং সম্ভবত উদাহরণস্বরূপ ব্যবহার করুনMath[x<0?'ceil':'floor'](x*PREC_LIM)/PREC_LIM
মাইকেএম

এর floorবদলে কেন round?
কুইন কমেন্ডেন্ট

12

আপনি ব্যবহার করতে পারেন parseFloat()এবং toFixed()যদি আপনি একটি ছোট অপারেশনের জন্য এই সমস্যাটিকে বাইপাস করতে চান:

a = 0.1;
b = 0.2;

a + b = 0.30000000000000004;

c = parseFloat((a+b).toFixed(2));

c = 0.3;

a = 0.3;
b = 0.2;

a - b = 0.09999999999999998;

c = parseFloat((a-b).toFixed(2));

c = 0.1;

11

Phpjs.org এ রাউন্ড () ফাংশনটি দুর্দান্তভাবে কাজ করে: http://phpjs.org/funitions/round

num = .01 + .06;  // yields 0.0699999999999
rnum = round(num,12); // yields 0.07

2
@ জেআরজি কনভেনশন অনুসারে, "5" দিয়ে শেষ হওয়া সংখ্যাগুলি নিকটতম এমনকি সমান দিকে বৃত্তাকার হয় (কারণ সর্বদা গোল করা বা নীচে নেওয়ার ফলে আপনার ফলাফলগুলির পক্ষপাতদর্শন করা হবে)। সুতরাং, দুটি দশমিক স্থানে গোল করা 4.725 প্রকৃতপক্ষে 4.72 হওয়া উচিত।
মার্ক এ। ডারহাম

9

0.6 * 3 এটি দুর্দান্ত!)) আমার জন্য এটি দুর্দান্ত কাজ করে:

function dec( num )
{
    var p = 100;
    return Math.round( num * p ) / p;
}

খুব খুব সাধারণ))


এই মত কিছু সঙ্গে যদিও কাজ করবে 8.22e-8 * 1.3?
পল কার্লটন

0.6 x 3 = 1.8, আপনি কোড 2 টি ফলাফল দেন ... তাই ভাল নয়।
Zyo

@ জাইও এটি এই মুহুর্তে 1.8 প্রদান করে। আপনি কিভাবে এটি চালানো?
ড্রেনাই

মজাদার. আপনি এটিতে গুণ এবং বিভাগ অপারেটরগুলিকে অদলবদল করতে পারেন এবং এটি কাজ করে।
অ্যান্ড্রু

9

লক্ষ্য করুন যে সাধারণ উদ্দেশ্যে ব্যবহারের জন্য, এই আচরণটি গ্রহণযোগ্য হতে পারে।
উপযুক্ত ক্রিয়া নির্ধারণের জন্য এই ভাসমান পয়েন্টের মানগুলির তুলনা করার সময় সমস্যা দেখা দেয়।
ES6 এর আবির্ভাবের সাথে Number.EPSILONগ্রহণযোগ্য ত্রুটি মার্জিন নির্ধারণের জন্য একটি নতুন ধ্রুবককে সংজ্ঞায়িত করা হয়েছে:
সুতরাং এর চেয়ে তুলনাটি সম্পাদন করার পরিবর্তে

0.1 + 0.2 === 0.3 // which returns false

আপনি একটি কাস্টম তুলনা ফাংশন সংজ্ঞায়িত করতে পারেন, এটি:

function epsEqu(x, y) {
    return Math.abs(x - y) < Number.EPSILON;
}
console.log(epsEqu(0.1+0.2, 0.3)); // true

সূত্র: http://2ality.com/2015/04/numbers-math-es6.html#numberepsilon


আমার ক্ষেত্রে নম্বর.এপসিলন খুব ছোট ছিল, যার ফলস্বরূপ0.9 !== 0.8999999761581421
টম

8

আপনি যে ফলাফলটি পেয়েছেন তা সঠিক এবং মোটামুটিভাবে বিভিন্ন ভাষা, প্রসেসর এবং অপারেটিং সিস্টেমে ভাসমান পয়েন্ট বাস্তবায়নের সাথে সামঞ্জস্যপূর্ণ - কেবলমাত্র সেই জিনিসটি পরিবর্তিত হয় যখন ভাসাটি আসলে একটি দ্বিগুণ (বা উচ্চতর) হয় inac

বাইনারি ভাসমান পয়েন্টগুলিতে 0.1 দশমিক 1/3 (যেমন 0.3333333333333 ... চিরকাল) এর মতো, এটি হ্যান্ডেল করার কোনও সঠিক উপায় নেই।

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

বেশিরভাগ সময় সমাধানটি নির্দিষ্ট পয়েন্টের গাণিতিকগুলিতে স্যুইচ করা না, কারণ এটি অনেক ধীর এবং 99% সময় আপনার সঠিকতার প্রয়োজন হয় না। যদি আপনি এমন স্টাফের সাথে লেনদেন করেন যা সেই স্তরের যথার্থতার প্রয়োজন হয় (উদাহরণস্বরূপ আর্থিক লেনদেন) তবে জাভাস্ক্রিপ্ট সম্ভবত যেভাবেই ব্যবহার করার সেরা সরঞ্জাম নয় (যেমন আপনি স্থির-পয়েন্টের ধরণের প্রয়োগ করতে চান স্থির ভাষা সম্ভবত আরও ভাল )।

আপনি মার্জিত সমাধানের সন্ধান করছেন তারপরে আমি ভয় পাচ্ছি যে এটি হ'ল: ভাসমানগুলি দ্রুত তবে ছোট গোলাকৃতি ত্রুটি থাকে - ফলাফলগুলি প্রদর্শন করার সময় সর্বদাই বোধগম্য কিছু থাকে round


8

এড়াতে আপনার ভাসমান পয়েন্টের পরিবর্তে পূর্ণসংখ্যার মানগুলির সাথে কাজ করা উচিত। সুতরাং যখন আপনি 2 পজিশনের নির্ভুলতার সাথে কাজ করতে চান 100 * মানগুলি, 3 পজিশনের জন্য 1000 ব্যবহার করুন display প্রদর্শন করার সময় বিভাজকটিতে রাখার জন্য একটি ফর্ম্যাটর ব্যবহার করুন।

অনেকগুলি সিস্টেমে দশমিকের সাথে কাজ করা বাদ দেয়। এ কারণেই অনেকগুলি সিস্টেম ডলার / ইউরোর (ভাসমান পয়েন্ট হিসাবে) পরিবর্তে সেন্ট (পূর্ণসংখ্যা হিসাবে) নিয়ে কাজ করে।


7

সমস্যা

ভাসমান পয়েন্ট সমস্ত দশমিক মান হুবহু সংরক্ষণ করতে পারে না। সুতরাং ভাসমান পয়েন্ট ফর্ম্যাটগুলি ব্যবহার করার সময় ইনপুট মানগুলিতে সর্বদা গোলাকৃতি ত্রুটি থাকবে। অবশ্যই ইনপুটগুলির ত্রুটিগুলি আউটপুটটিতে ত্রুটিগুলির ফলাফল করে। একটি বিচ্ছিন্ন ফাংশন বা অপারেটরের ক্ষেত্রে ফাংশন বা অপারেটর বিচ্ছিন্ন যেখানে বিন্দুর চারপাশে আউটপুট নিয়ে বড় পার্থক্য হতে পারে।

ভাসমান পয়েন্টের মানগুলির জন্য ইনপুট এবং আউটপুট

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

  • প্রত্যাশিত নির্ভুলতার জন্য রাউন্ড ইনপুটগুলি বা নিশ্চিত করুন যে উচ্চতর নির্ভুলতার সাথে কোনও মান প্রবেশ করা যায় না।
  • আউটপুটগুলিতে গোল করা / ফর্ম্যাট করার আগে একটি ছোট মান যুক্ত করুন যা পছন্দসই নির্ভুলতার 1/4 এর চেয়ে কম বা সমান এবং ইনপুট এবং গণনার সময় গোলাকার ত্রুটির কারণে সর্বাধিক প্রত্যাশিত ত্রুটির চেয়ে বড়। যদি এটি সম্ভব না হয় তবে ব্যবহৃত ডেটা ধরণের নির্ভুলতার সংমিশ্রণ আপনার গণনার জন্য পছন্দসই আউটপুট নির্ভুলতা সরবরাহ করতে যথেষ্ট নয়।

এই 2 টি জিনিস সাধারণত করা হয় না এবং বেশিরভাগ ক্ষেত্রে এগুলি না করার ফলে সৃষ্ট তফাতগুলি বেশিরভাগ ব্যবহারকারীর পক্ষে গুরুত্বপূর্ণ খুব কম, তবে আমার ইতিমধ্যে একটি প্রকল্প ছিল যেখানে এই সংশোধনগুলি ছাড়াই আউটপুট ব্যবহারকারীরা গ্রহণ করেনি।

স্বতন্ত্র ফাংশন বা অপারেটর (মডুলার মতো)

যখন বিযুক্ত অপারেটর বা ফাংশনগুলি জড়িত থাকে, আউটপুটটি প্রত্যাশার মতো হয় তা নিশ্চিত করার জন্য অতিরিক্ত সংশোধনের প্রয়োজন হতে পারে। রাউন্ডিংয়ের আগে গোল করা এবং ছোট সংশোধন যুক্ত করা সমস্যার সমাধান করতে পারে না।
মধ্যবর্তী গণনার ফলাফলগুলির জন্য একটি বিশেষ চেক / সংশোধন, তত্ক্ষণাত বিযুক্ত ফাংশন বা অপারেটর প্রয়োগের পরে প্রয়োজন হতে পারে। একটি নির্দিষ্ট ক্ষেত্রে (মডুলা অপারেটর), আমার প্রশ্নের উত্তরটি দেখুন: কেন মডেলাস অপারেটর জাভাস্ক্রিপ্টে ভগ্নাংশের সংখ্যা ফেরায়?

সমস্যা হওয়া এড়ানো ভাল

এই জাতীয় গণনার জন্য ডেটা টাইপ (পূর্ণসংখ্যা বা ফিক্সড পয়েন্ট ফর্ম্যাট) ব্যবহার করে এই সমস্যাগুলি এড়াতে প্রায়শই দক্ষ হয় যা বৃত্তাকার ত্রুটি ছাড়াই প্রত্যাশিত ইনপুট সংরক্ষণ করতে পারে। এর একটি উদাহরণ হ'ল আর্থিক গণনার জন্য আপনার কখনও ভাসমান পয়েন্টের মানগুলি ব্যবহার করা উচিত নয়।


4

কটাক্ষপাত আছে নির্দিষ্ট-বিন্দু গাণিতিক । এটি সম্ভবত আপনার সমস্যার সমাধান করবে, যদি আপনি পরিচালনা করতে চান এমন সংখ্যার পরিসর যদি ছোট হয় (যেমন, মুদ্রা)। আমি এটিকে কয়েক দশমিক মান হিসাবে প্রকাশ করব, যা সবচেয়ে সহজ সমাধান।


5
সমস্যা ভাসমান পয়েন্ট বনাম স্থির বিন্দু নয়, সমস্যা বাইনারি বনাম দশমিক।
মাইকেল বর্গওয়ার্ট

4

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


4

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


4

এখানে চিত্র বর্ণনা লিখুন

    You can use library https://github.com/MikeMcl/decimal.js/. 
    it will   help  lot to give proper solution. 
    javascript console output 95 *722228.630 /100 = 686117.1984999999
    decimal library implementation 
    var firstNumber = new Decimal(95);
    var secondNumber = new Decimal(722228.630);
    var thirdNumber = new Decimal(100);
    var partialOutput = firstNumber.times(secondNumber);
    console.log(partialOutput);
    var output = new Decimal(partialOutput).div(thirdNumber);
    alert(output.valueOf());
    console.log(output.valueOf())== 686117.1985

3

আপনি ঠিক বলেছেন, এর কারণ হ'ল ভাসমান পয়েন্ট সংখ্যাগুলির সীমাবদ্ধতা। আপনার যৌক্তিক সংখ্যাগুলি দুটি পূর্ণসংখ্যার সংখ্যার বিভাজন হিসাবে সংরক্ষণ করুন এবং বেশিরভাগ পরিস্থিতিতে আপনি কোনও নির্ভুল ক্ষতি ছাড়াই সংখ্যা সংরক্ষণ করতে সক্ষম হবেন। এটি মুদ্রণের ক্ষেত্রে, আপনি ভগ্নাংশ হিসাবে ফলাফলটি প্রদর্শন করতে চাইতে পারেন। আমি প্রস্তাবিত প্রতিনিধিত্ব সঙ্গে, এটি তুচ্ছ হয়ে ওঠে।

অবশ্যই এটি অযৌক্তিক সংখ্যার সাথে বেশি সাহায্য করবে না। তবে আপনি আপনার কম্পিউটেশনগুলিকে যেভাবে সবচেয়ে কম সমস্যার সৃষ্টি করবেন (যেমন, পরিস্থিতি সনাক্তকরণের মতো করে তোলে) সেগুলি অনুকূল করতে পারেন sqrt(3)^2)


আপনি ঠিক বলেছেন, এর কারণ ভাসমান পয়েন্ট সংখ্যাগুলির সীমিত সূক্ষ্মতা - <pedant>আসলে, ওপি একে ভাসমান পয়েন্ট অপারেশনকে নীচে </pedant>
রেখেছিল

3

আমি Mod 3 সঙ্গে একটি বাজে গোলাকার ত্রুটি সমস্যা ছিল কখনও কখনও যখন আমি 0 পেতে হবে আমি পেতে হবে .000 ... 01। এটি পরিচালনা করা যথেষ্ট সহজ, কেবল <= .01 এর জন্য পরীক্ষা করুন। তবে তারপরে মাঝে মাঝে আমি 2.99999999999998 পেতাম। সেকি!

বিগ নাম্বারগুলি সমস্যাটি সমাধান করেছে, তবে আরেকটি পরিচয় করিয়ে দিয়েছে কিছুটা বিড়ম্বনার , সমস্যা। 8.5 কে বিগন নাম্বারে লোড করার চেষ্টা করার সময় আমাকে জানানো হয়েছিল যে এটি সত্যই 8.4999… এবং এর মধ্যে 15 টিরও বেশি উল্লেখযোগ্য সংখ্যা রয়েছে। এর অর্থ হ'ল বিগ নাম্বারগুলি এটি গ্রহণ করতে পারে না (আমি বিশ্বাস করি যে আমি উল্লেখ করেছি যে এই সমস্যাটি কিছুটা হাস্যকর ছিল)।

হাস্যকর সমস্যার সহজ সমাধান:

x = Math.round(x*100);
// I only need 2 decimal places, if i needed 3 I would use 1,000, etc.
x = x / 100;
xB = new BigNumber(x);

2

নম্বর ব্যবহার করুন (1.234443) .ফিক্সড (2); এটি 1.23 মুদ্রণ করবে

function test(){
    var x = 0.1 * 0.2;
    document.write(Number(x).toFixed(2));
}
test();

2

জাভাস্ক্রিপ্টে ভাসমান-পয়েন্ট ম্যানিপুলেশন সমস্যা এড়াতে দশমিক.জে , বিগ.জেস বা বিগনবার.জেএস ব্যবহার করা যেতে পারে:

0.1 * 0.2                                // 0.020000000000000004
x = new Decimal(0.1)
y = x.times(0.2)                          // '0.2'
x.times(0.2).equals(0.2)                  // true

big.js: মিনিমালিস্ট; ব্যবহার করা সহজ; দশমিক স্থানে নির্দিষ্ট স্পষ্টতা; নির্ভুলতা শুধুমাত্র বিভাগে প্রয়োগ করা হয়।

bignumber.js: ঘাঁটি 2-64; কনফিগারেশন অপশন; NaN; অসীম; দশমিক স্থানে নির্দিষ্ট স্পষ্টতা; নির্ভুলতা শুধুমাত্র বিভাগে প্রয়োগ করা হয়; বেস উপসর্গ।

দশমিক.জেএস: ঘাঁটি 2-64; কনফিগারেশন অপশন; NaN; অসীম; অ-পূর্ণসংখ্যার শক্তি, এক্সপ্রেস, এলএন, লগ; স্পষ্টতা উল্লেখযোগ্য সংখ্যা নির্দিষ্ট; যথার্থ সর্বদা প্রয়োগ; এলোমেলো সংখ্যা।

বিস্তারিত তুলনা লিঙ্ক


2

মার্জিত, অনুমানযোগ্য এবং পুনরায় ব্যবহারযোগ্য

আসুন সমস্যাটি একটি মার্জিত উপায়ে পুনরায় ব্যবহারযোগ্য উপায়ে মোকাবেলা করুন। নিম্নলিখিত সাতটি লাইন আপনাকে .decimalসংখ্যা, সূত্র, বা Mathফাংশনে অন্তর্নির্মিতভাবে শেষের সাথে সংযুক্ত করে যে কোনও সংখ্যার উপর আপনার ইচ্ছা ভাসমান পয়েন্ট যথার্থতা অ্যাক্সেস করতে দেবে ।

// First extend the native Number object to handle precision. This populates
// the functionality to all math operations.

Object.defineProperty(Number.prototype, "decimal", {
  get: function decimal() {
    Number.precision = "precision" in Number ? Number.precision : 3;
    var f = Math.pow(10, Number.precision);
    return Math.round( this * f ) / f;
  }
});


// Now lets see how it works by adjusting our global precision level and 
// checking our results.

console.log("'1/3 + 1/3 + 1/3 = 1' Right?");
console.log((0.3333 + 0.3333 + 0.3333).decimal == 1); // true

console.log(0.3333.decimal); // 0.333 - A raw 4 digit decimal, trimmed to 3...

Number.precision = 3;
console.log("Precision: 3");
console.log((0.8 + 0.2).decimal); // 1
console.log((0.08 + 0.02).decimal); // 0.1
console.log((0.008 + 0.002).decimal); // 0.01
console.log((0.0008 + 0.0002).decimal); // 0.001

Number.precision = 2;
console.log("Precision: 2");
console.log((0.8 + 0.2).decimal); // 1
console.log((0.08 + 0.02).decimal); // 0.1
console.log((0.008 + 0.002).decimal); // 0.01
console.log((0.0008 + 0.0002).decimal); // 0

Number.precision = 1;
console.log("Precision: 1");
console.log((0.8 + 0.2).decimal); // 1
console.log((0.08 + 0.02).decimal); // 0.1
console.log((0.008 + 0.002).decimal); // 0
console.log((0.0008 + 0.0002).decimal); // 0

Number.precision = 0;
console.log("Precision: 0");
console.log((0.8 + 0.2).decimal); // 1
console.log((0.08 + 0.02).decimal); // 0
console.log((0.008 + 0.002).decimal); // 0
console.log((0.0008 + 0.0002).decimal); // 0

চিয়ার্স!


2
যদি আপনি ডাউনটায়েট করতে বেছে নেন তবে কমপক্ষে কোনও কারণ দিন।
বার্নেস্তো

1

ব্যবহার

var x = 0.1*0.2;
 x =Math.round(x*Math.pow(10,2))/Math.pow(10,2);

4
হুম ... তবে মনে রাখবেন, এটি সর্বদা 2 দশমিকের চেয়ে বেশি হয়। এটি অবশ্যই একটি বিকল্প হতে পারে তবে 0.55 * 0.55 গণনার কী হবে (যেহেতু আমি আগে থেকে সঠিক সংখ্যা জানি না That এটি 0.3025 এর পরিবর্তে 0.3 দেবে Of অবশ্যই আমি তখন ব্যবহার করতে পারব R Math.round(x*Math.pow(10,4))/Math.pow(10,4);রাউন্ডিং সর্বদা একটি বিকল্প, কিন্তু আমি শুধু জানতে কিছু ভাল সমাধান পাওয়া যাবে আছে কিনা চেয়েছিলেন
জুড়ী

10.2 সবসময় 10,19 ফেরৎ jsbin.com/tozogiwide/edit?html,js,console,output
Žilvinas


1

এটি আমার পক্ষে কাজ করে:

function round_up( value, precision ) { 
    var pow = Math.pow ( 10, precision ); 
    return ( Math.ceil ( pow * value ) + Math.ceil ( pow * value - Math.ceil ( pow * value ) ) ) / pow; 
}

round_up(341.536, 2); // 341.54

1
দুর্ভাগ্যক্রমে, রাউন্ড_আপ (4.15,2) => 4.16।
jrg

1

নিম্নলিখিত ফাংশন ব্যবহার করে আউটপুট:

var toFixedCurrency = function(num){
    var num = (num).toString();
    var one = new RegExp(/\.\d{1}$/).test(num);
    var two = new RegExp(/\.\d{2,}/).test(num);
    var result = null;

    if(one){ result = num.replace(/\.(\d{1})$/, '.$10');
    } else if(two){ result = num.replace(/\.(\d{2})\d*/, '.$1');
    } else { result = num*100; }

    return result;
}

function test(){
    var x = 0.1 * 0.2;
    document.write(toFixedCurrency(x));
}

test();

আউটপুট মনোযোগ দিন toFixedCurrency(x)

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